我想创建一个类模板
template <class T>
class X {
// here I'll use T::value (among other things)
};
T::value
通常是 constexpr 静态变量,但并非总是如此。 T::value
必须是正值,所以我想在编译期间尽可能让人们知道。
如果 T::value
总是 constexpr,我会添加 static_assert
之类的
static_assert(T::value > 0, "need positive number");
是否可以仅在 T::value
为 constexpr 的情况下添加此 static_assert?
最佳答案
我们可以编写一个 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
是一个常量表达式时才有效,否则它将被 SFINAE 淘汰。第二个重载无论如何都是有效的,所以我们用一个虚拟的 int
参数来消除重载的歧义。
现在我们像这样测试它:
static_assert(is_valid<T>(0), "need positive number");
关于c++ - static_assert 如果表达式是 constexpr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37320548/