c++ - static_assert 如果表达式是 constexpr

标签 c++ sfinae typetraits static-assert

我想创建一个类模板

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");

Live Demo

关于c++ - static_assert 如果表达式是 constexpr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37320548/

相关文章:

c++ - 为什么 SFINAE 在这种情况下不起作用?

c++ - C++ 中是否可以使用条件类型定义?

c++ - 为什么变量不是 C++ 中的左值?

C++ 类型特征提取模板参数的特化值

c++ - 如何移动STL容器内的元素

c++ - 您建议使用这两种将此数组转换为整数的方法中的哪一种?

c++ - is_container 特性在 std::set SFINAE 问题上失败

c++ - 需要澄清 SFINAE 中的 Lambdas、auto 和 decltype

c++ - 为什么不允许使用 "second C linkage of overloaded function"?

c++ - KeyboardProc 返回 TRUE 会导致性能下降