is_defined constexpr函数

时间:2015-03-19 10:34:25

标签: c++11 c++14 constexpr

我需要知道在指定noexcept说明符时是否定义了NDEBUG。我正在考虑这个constexpr功能:

constexpr inline bool is_defined() noexcept
{
  return false;
}

constexpr inline bool is_defined(int) noexcept
{
  return true;
}

然后使用它:

void f() noexcept(is_defined(NDEBUG))
{
  // blah, blah
}

标准库或语言是否已经为此提供了便利,以便我不会重新发明轮子?

2 个答案:

答案 0 :(得分:5)

只需使用#ifdef

#ifdef  NDEBUG
using is_ndebug = std::true_type;
#else
using is_ndebug = std::false_type;
#endif

void f() noexcept(is_ndebug{}) {
  // blah, blah
}

或无数其他类似方式:constexpr函数返回boolstd::true_type(有条件地)。两种类型之一的static变量。一个traits类,它带有一个列出各种#define令牌等价物(eNDEBUG等)的枚举,它可以专门用于它支持的每个这样的令牌,如果没有这样的支持则会产生错误。使用typedef而不是using(如果你的编译器支持使用,我正在看你MSVC2013)。我相信可能还有其他人。

答案 1 :(得分:2)

如果您只对NDEBUG感兴趣,这相当于测试assert()是否评估它的参数。在这种情况下,您可以使用:

void f() noexcept(noexcept(assert((throw true,true))))
{
    // ...
}

这当然不一定是改进:)