2017-04-26 61 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>{}}; 
相关问题