我想创建一个类模板
template <class T>
class X {
// here I'll use T::value (among other things)
};
T::value
通常是 constexpr 静态变量,但并非总是如此。T::value
必须是正值,所以我想尽可能在编译过程中让人们知道它。
If T::value
总是 constexpr,我想补充一下static_assert
like
static_assert(T::value > 0, "need positive number");
是否可以仅在以下情况下添加此 static_assertT::value
是 constexpr?
我们可以写一个is_valid
模板函数(想出一个更好的名字)有两个重载:
template <typename T, int N = T::value>
constexpr bool is_valid(int) {
return N > 0;
}
template <typename T>
constexpr bool is_valid(...) {
return true;
}
第一次重载仅在以下情况下才有效T::value
是一个常量表达式,否则会被 SFINAEd 出局。无论如何,第二个重载都是有效的,因此我们用虚拟来消除重载的歧义int
范围。
现在我们像这样测试它:
static_assert(is_valid<T>(0), "need positive number");
Live Demo http://coliru.stacked-crooked.com/a/8282052384aad7c8
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)