这是我的程序尝试使用std :: conditional根据整数模板参数的值设置成员变量的类型。
#include <stdio.h>
#include <type_traits>
using namespace std;
class cool{
public:
cool(){ printf("Cool!\n"); }
};
class notcool{
public:
notcool(){ printf("Not cool!\n"); }
};
template<int N>
class myclass{
public:
typedef std::conditional<N==5,cool,notcool> thetype;
thetype theinst;
};
int main(){
printf("Testing\n");
myclass<5> myc5;
myclass<6> myc6;
printf("Done testing\n");
return 0;
}
我希望我的程序能够提供以下输出:
测试
酷!
不酷!
完成测试
相反,输出是
测试
完成测试
我的编译器是GCC 4.9,我编译这个程序的方式是使用命令g ++ test -std = c ++ 11 -o test
有谁能告诉我为什么程序没有给出我期望的输出?
答案 0 :(得分:3)
typedef typename std::conditional<N==5,cool,notcool>::type thetype;
// ^^^^^^^^ ^^^^^^
答案 1 :(得分:3)
thetype
实际上不是cool
,也不是notcool
。但是std::conditional
。
是。 std::conditional
是一种类型,这就是大多数类型特征的实现方式。如果要从条件中获取基础类型,则需要从type
访问基础std::conditional
成员。这也是大多数类型特征的实现方式:它们都有一个type
成员,可以用来访问你想要的实际类型,而不是类型特征类型。
在C ++ 14中,您将使用std::conditional_t
,它只是type
std::conditional
成员的别名,但因为您使用的是C ++ 11,所以需要明确地访问它:
typedef typename std::conditional<N == 5, cool, notcool>::type thetype;