我需要知道在指定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
}
标准库或语言是否已经为此提供了便利,以便我不会重新发明轮子?
答案 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
函数返回bool
或std::true_type
(有条件地)。两种类型之一的static
变量。一个traits类,它带有一个列出各种#define
令牌等价物(eNDEBUG
等)的枚举,它可以专门用于它支持的每个这样的令牌,如果没有这样的支持则会产生错误。使用typedef
而不是using
(如果你的编译器支持使用,我正在看你MSVC2013)。我相信可能还有其他人。
答案 1 :(得分:2)
如果您只对NDEBUG
感兴趣,这相当于测试assert()
是否评估它的参数。在这种情况下,您可以使用:
void f() noexcept(noexcept(assert((throw true,true))))
{
// ...
}
这当然不一定是改进:)