2015-03-19 113 views
3

我需要知道在指定noexcept說明符時是否定義了NDEBUG。我沿着這constexpr功能的思路思考:is_defined 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

如果您只對NDEBUG感興趣,這相當於測試assert()是否評估它的參數。在這種情況下,你可以使用:

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

這是當然,不一定是改善:)

+0

非常有趣的技巧。 – user1095108 2015-03-19 17:39:49

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。一個特徵類,需要一個列舉各種#define令牌等價物(eNDEBUG等)的enum,它可以專用於它支持的每個此類標記,並在沒有此類支持時生成錯誤。使用typedef而不是using(如果你的編譯器有使用的片狀支持,我在看你MSVC2013)。我確定可以有其他人。

+0

有無數的方法,但並非所有的工作,因爲編譯器的bug。它是gcc:錯誤'noexcept()'具有不同的異常說明符' – user1095108 2015-03-19 13:58:30