2017-04-26 7 views
3

constexpr으로 실험하기 시작했습니다.
내가 달성하려고하는 것은 literal 숫자 값 이 ctor 매개 변수로 제공되었는지 확인하는 것입니다.
나는 예상대로 MyStructconstexpr 등의 작품을 표시 값 < = 4constexpr을 사용하여 생성자에서 리터럴 매개 변수의 유효성을 검사합니다.

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 
} 

MyStruct 을 구성하지만 그것을 변경할 수 없습니다 때문에 add를 호출 방지 경우 던지고, 다음으로 시작했다.

필자는 리터럴 값 (컴파일 타임에 알려진)만을 대상으로하므로이 작업을 수행 할 수 있다고 생각합니다.
템플릿을 피하고 싶습니다.

+0

함수 인자는 아니다 const expression : -/생성자 내부에서 컴파일 시간 검사를 허용하기 위해'std :: integral_constant '를 전달할 수 있습니다. – Jarod42

답변

5

함수 인수하지 const를 표현입니다 : -/

당신은 생성자 내부의 컴파일 시간 체크를 할 수 있도록 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>{}};