2017-05-22 5 views
0

나는 디자인 계약을 위해 을 많은 그룹으로 묶는 constexpr 함수를 가지고있다. 사용하지 않는 constexpr 변수를 만들지 않고 컴파일 타임에 호출하고 싶습니다.컴파일 타임에 void constexpr 트리거?

다음은 현재 수행해야하는 작업의 예입니다 (C++ 17).

template<size_t N = 0, typename... Ts, typename F> 
inline constexpr int tuple_for(const std::tuple<Ts...>& t, const F& func) { 
    func(std::get<N>(t)); 

    if constexpr(N < sizeof...(Ts) - 1) { 
     return tuple_for<N + 1, Ts...>(t, func); 
    } else { 
     return 0; 
    } 
} 

auto do_checks = [](const auto& t) { 
    static_assert(has_some_method_v<decltype(t)>, 
      "You need some_method"); 
    return 0; 
} 

[[maybe_unused]] 
constexpr int i_am_sad = tuple_for(my_tuple, do_checks); 

이 동작을 수행하는 다른 방법이 있습니까? 어쩌면 뭔가 새로운 C++ 17일까요?

감사합니다.

편집 : 이러한 검사가 일반화되기 때문에 함수에 어설 션을 사용하는 것이 올바른 방법이라고 생각합니다.

+0

정말 래퍼 함수가 필요하지 않습니다. 그냥'static_assert'를 그대로 두십시오. – VTT

+0

이 예제를 수정해야합니다. 이것은 객체의 튜플에서 실행됩니다. 그래서 실제 코드베이스에서 필요합니다. – scx

+0

왜 돌아 가야합니까? 이 함수는 반환 값없이 호출하면됩니다. – Kobi

답변

2

당신은 static_assert 같은 다른 constexpr 컨텍스트에서 사용할 수 있습니다

static_assert((static_cast<void>(tuple_for(my_tuple, do_checks)), true), "!"); 

[참고] : void에 캐스팅 당신이 악 과부하 쉼표로 클래스를 반환 할 경우, 일반화하는 것입니다.

+0

시각적으로 즐겁지는 않지만 감사합니다. 악마 콤마 오버로드 란 무엇입니까? 흥미로운 것 같습니다. – scx

+0

[Demo] (https://ideone.com/4vlfms)에 악의적 인 연산자 쉼표가 과부하되었습니다. – Jarod42

+0

오 마이어! 그건 너무 악한 ... 나는 그것을 좋아한다 : D 약간의 매크로 도우미를 만들었고 꽤 깨끗해 보였다. – scx

0

static_assert선언문 -이므로 여유 공간에 배치하면됩니다.

기능이 필요하지 않습니다.

이것은 정확하게 그 사용 사례입니다. :)

+0

예제가 좋지 않아서 내가 뭘 더 닮았는지 편집 해 보겠습니다. 5 분 : – scx

관련 문제