struct,是基础模板,C++
Struct, is fundamental template,C++
我想检查结构的模板参数是否是基本的。
所以我创建了一个结构
template<typename T, typename = std::enable_if<std::is_fundamental_v<T>>>
struct Something {
};
还有一个空结构
struct AStruct{
};
使用 is_fundamental
我希望只有当模板参数 T
是 long long int
、 [=16= 等基本类型之一时,我的结构才会被“启用” ] 和其他人...
但是当我像
这样进行专业化时
using Defined = Something<AStruct>;
它编译得很好,所以我错过了什么?或者我做错了什么?
应该是std::enable_if_t<std::is_fundamental_v<T>>
(添加了_t)或者typename std::enable_if<std::is_fundamental_v<T>>::type
.
我建议改为 static_assert
:
- 使用
Something<AStruct, void>
避免劫持(也可以使用首选 std::enable_if_t<cond, int> = 0
修复)
- 你的 class 无论如何都不是 SFINAE 友好的,所以硬错误允许自定义消息。
- 更简单的语法:)
我想检查结构的模板参数是否是基本的。 所以我创建了一个结构
template<typename T, typename = std::enable_if<std::is_fundamental_v<T>>>
struct Something {
};
还有一个空结构
struct AStruct{
};
使用 is_fundamental
我希望只有当模板参数 T
是 long long int
、 [=16= 等基本类型之一时,我的结构才会被“启用” ] 和其他人...
但是当我像
这样进行专业化时using Defined = Something<AStruct>;
它编译得很好,所以我错过了什么?或者我做错了什么?
应该是std::enable_if_t<std::is_fundamental_v<T>>
(添加了_t)或者typename std::enable_if<std::is_fundamental_v<T>>::type
.
我建议改为 static_assert
:
- 使用
Something<AStruct, void>
避免劫持(也可以使用首选std::enable_if_t<cond, int> = 0
修复) - 你的 class 无论如何都不是 SFINAE 友好的,所以硬错误允许自定义消息。
- 更简单的语法:)