static_assert if 表达式为 constexpr

2024-01-24

我想创建一个类模板

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(使用前将#替换为@)

static_assert if 表达式为 constexpr 的相关文章

随机推荐