2017-07-04 74 views
3

我試圖根據應用於函數的屬性來實現不同的行爲。基本上我試圖看看是否有可能在編譯時測試屬性的存在。是否可以在C++中測試屬性說明符?

struct AbortError 
{ 
    [[noreturn]] static void error(const std::string& msg) 
    { 
     std::cerr << "critical error: " << msg << std::endl; 
     std::abort(); 
    } 
} 

struct LogError 
{ 
    static void error(const std::string& msg) 
    { 
     std::cerr << "non-critical error: " << msg << std::endl; 
    } 
} 

是否可以測試[[noreturn]]的存在?

我希望能像acheive

template <typename ErrorPolicy> 
void function() 
{ 
    // ... 
    if constexpr(std::is_noreturn<ErrorPolicy::error>::value) 
    { 
     performCriticalCleanup(); 
    } 

    ErrorPolicy::error("Bad things happened."); 
} 
+3

屬性不是簽名的一部分,並且C++沒有反射... – Jarod42

回答

1

東西由於C++沒有reflection,答案是沒有:這是不可能的。

相反,我建議你做的是做出不同的設計選擇,以達到相同的目標。 您可以在運行環境中使用例如polymorfism

如果您在編譯時需要一些代碼,您可以在結構中「集成」一個常量表達式,並在以後檢查它。

例如:

struct AbortError { 
    static constexpr bool critical = true; 
    // ... 
}; 

struct AbortError: std::true_type { 
// ... 
}; 

Here在線示例示出了這兩個選項。

+0

即使C++得到了反射,它也可能不包含屬性(直到後來,如果它決定反思它是一個好主意函數來包含屬性) – Justin

相關問題