返回信息流template<typename T, bool C = true>
struct if_ {
static const int value = 1;
};
template<typename T>
struct if_<T, true> {
static const int value = 2;
};
int main() {
printf("value: %d\n", if_<int>::value);
}
这段代码,输出为什么是2啊?匹配的逻辑是什么?另外,原贴作者说这段代码等价于下面这个,不明白原因!
template<typename T, bool C = true>
struct if_ {};
template<typename T>
struct if_<T, false> {
static const int value = 1;
};
template<typename T>
struct if_<T, true> {
static const int value = 2;
};
int main() {
printf("value: %d\n", if_<int>::value);
}
求指教!
这是一条镜像帖。来源:北邮人论坛 / cpp / #88683同步于 2015/9/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
请大神帮我看一下这个关于模板的问题!
wanderer
2015/9/18镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
应该是类模板的部分特化
第二个if_是第一个if_的部分特化,c++ primer: "当声明了部分特化的时候,编译器将为实例化选择最特化的模板定义,当没有部分特化可以使用的时候,就使用通用模板定义。"
【 在 xiaobing307 的大作中提到: 】
: 应该是类模板的部分特化
: 第二个if_是第一个if_的部分特化,c++ primer: "当声明了部分特化的时候,编译器将为实例化选择最特化的模板定义,当没有部分特化可以使用的时候,就使用通用模板定义。"
恩。
应该是这个意思,不过有两点疑问:
1. 通用模板定义里多出一个模板参数C,默认值是true,这对于特化没有影响是吗?
2. 如果按特化的说法在第一个程序里选了2, 那第二个程序里,为什么不选那个默认值为false的呢,难道默认值默认为true?
【 在 xiaobing307 的大作中提到: 】
: 应该是类模板的部分特化
: 第二个if_是第一个if_的部分特化,c++ primer: "当声明了部分特化的时候,编译器将为实例化选择最特化的模板定义,当没有部分特化可以使用的时候,就使用通用模板定义。"
1,没懂你的意思
2,template<typename T, bool C = true>
struct if_ {};
写着默认为true,没有提供额外参数,就会选true吧。
至于你说的不选默认值为false的,那东西应该不是默认值,而是一个模板参数,变量值,就是false。
【 在 wanderer 的大作中提到: 】
: 应该是这个意思,不过有两点疑问:
: 1. 通用模板定义里多出一个模板参数C,默认值是true,这对于特化没有影响是吗?
: 2. 如果按特化的说法在第一个程序里选了2, 那第二个程序里,为什么不选那个默认值为false的呢,难道默认值默认为true?
【 在 wanderer 的大作中提到: 】
: template<typename T, bool C = true>
: struct if_ {
: static const int value = 1;
: ...................
//if_<int>::value 就是if_<int, true>::value --> 选择最特化的template进行实例化:
//template<typename T, true> struct if_ { ..... }
printf("value: %d\n", if_<int>::value);
看起来还是蛮正常的