我一直认为你可以定义一个像
这样的特质enum MyEnum { val_1, val_2, val_3 };
template< typename T >
struct my_trait {
static const MyEnum value = MyEnum::val_1;
};
然后将其专门化
template<>
struct my_trait < void >{
static const MyEnum value = val_3;
};
当我尝试它时,我总是会收到链接器错误,因为static
成员没有定义,所以我必须在源文件中明确地将它专门化为
MyEnum my_trait < void >::value = val_3;
并将标题中的定义更改为
template<>
struct is_void< void >{
static const MyEnum value;
};
有没有办法直接在标题中定义特征而不必在标题中重新定义它?
答案 0 :(得分:0)
不完全是你的问题的答案,但是...在你的例子中(如果你可以使用C ++ 11编译器)你可以使用std::integral_constant
。
一个完整的例子
#include <iostream>
#include <type_traits>
enum MyEnum { val_1, val_2, val_3 };
template< typename T >
struct my_trait : public std::integral_constant<MyEnum, MyEnum::val_1>
{ };
template<>
struct my_trait<void> : public std::integral_constant<MyEnum, MyEnum::val_3>
{ };
int main ()
{
std::cout << my_trait<void>::value << std::endl; // print 2 (aka val_3)
std::cout << my_trait<int>::value << std::endl; // print 0 (aka val_1)
}
答案 1 :(得分:0)
这将导致链接器错误:
std::cout << &is_void<void>::value << std::endl;
因为你使用value
- 这意味着你需要它的地址。我不确定,但这也可能发生在引用中 - 因为它们可能在内部实现为指针。因此,在c ++ 14之前,您必须定义value
内部实现文件。
从C ++ 17开始,你可以使用内联变量将它们保存在一个地方,即使你需要使用它:
template< typename T >
struct is_void{
inline static const bool value = false;
^^^^^^
};