2017-04-26 59 views
3

我開始嘗試使用constexpr
我想要實現的是驗證literal數值 作爲ctor參數提供。
我開始用下面扔如果構建MyStruct 與價值< = 4使用constexpr驗證構造函數中的文字參數

constexpr int validate(int v) 
{ 
    return (v > 4) ? v : throw exception(); 
}; 

struct MyStruct final 
{ 
    constexpr MyStruct(const int v) 
    : _v{validate(v)} 
    { 
    } 

    void add(int toAdd) 
    { 
    _v += toAdd; 
    } 

    int _v; 
}; 

int main(int argc, char**) 
{ 
    constexpr MyStruct a{500}; // ok so far... 
    a.add(argc);    // ...nope 
    MyStruct b{500};   // check at runtime :(
    MyStruct c{argc};   // runtime check ok 
} 

標記如預期MyStructconstexpr的作品,但這個防止調用add,因爲它是不可變的。

我認爲這可以做到,因爲我只針對文字值(在編譯時已知)。
我想避免模板。

+0

函數的參數不const表達式: - /你可以傳遞'std :: integral_constant '來允許在構造函數中進行編譯時檢查。 – Jarod42

回答

5

功能參數不是常量表達式: -/

您可能傳遞std::integral_constant<std::size_t, 4u>允許在構造函數中的編譯時檢查:

struct MyStruct final 
{ 
    // For runtime or constexpr usage. 
    constexpr MyStruct(int v) : _v{validate(v)} {} 

    // For compile-time values 
    template <std::size_t N> 
    constexpr MyStruct(std::integral_constant<std::size_t, N>) : _v{N} 
    { 
     static_assert(N > 4, "Unexpected"); 
    } 

    // ... 
}; 

然後

MyStruct b{std::integral_constant<std::size_t, 500>{}}; 
相關問題