템플릿 유형 목록을 반복하는 동안 재귀를 멈출 수 없습니다.

안토니오 칸타 렐라

그래서 다음과 같은 템플릿 유형 목록이 있습니다.

template <typename... Types>
struct type_list
{
};

다음과 같은 접근 자 기능을 만들었습니다.

template<class TypeList, size_t ElementIndex>
struct at;

template <template<typename...> class TypeList, typename Head, typename... OtherTypes, size_t ElementIndex>
struct at<  TypeList<Head, OtherTypes...>,  ElementIndex>
{
    static_assert(ElementIndex < (size_v<   TypeList<Head, OtherTypes...>   >), "at_t : ElementIndex is bigger than list size");

    using type = if_else_t < ElementIndex == 0, Head, typename at<  TypeList<OtherTypes...>, ElementIndex - 1   >::type >;
};

template <template<typename...> class TypeList, typename Last, size_t ElementIndex>
struct at<  TypeList<Last>, ElementIndex>
{
    static_assert(ElementIndex < (size_v<   TypeList<Last>  >), "at_t : ElementIndex is bigger than list size");

    using type = Last;
};

template<class TypeList, size_t ElementIndex>
using at_t = typename at<TypeList, ElementIndex>::type;

if_else_t<>다음과 같은 구현이 :

template<bool Condition, typename True, typename False>
struct if_else
{
    using type = True;
};

template<typename True, typename False>
struct if_else<false, True, False>
{
    using type = False;
};

이제 다음을 사용하여 함수를 테스트하면

static_assert(std::is_same_v<   bool, at_t< type_list<int, float, bool, char>, 2    >   >, "at_t : Bad result");

ElementIndex가 목록 크기보다 큰지 확인하는 static_assert를 트리거합니다. 컴파일러의 출력에서 at<>ElementIndex가 수치 제한 (ElementIndex = 0-1 인 경우)에 도달하고 static_assert가 트리거 될 때까지 절대 재귀를 중지하지 않음을 분명히 알 수 있습니다 .

내가 도대체 ​​뭘 잘못하고있는 겁니까 ?

이상적인 대답은 또한 더 좋고, 더 우아하고, 구현해야합니다. at<>:)

MSVC 및 C ++ 17을 사용하고 있습니다.

Artyer

문제는 다음과 같은 경우입니다.

if_else_t < ElementIndex == 0, Head, typename at<  TypeList<OtherTypes...>, ElementIndex - 1   >::type >;

하더라도 ElementIndex이고 0, 다른 두 종류의 증류기에 보내 것으로 평가되어야한다 if_else_t(따라서 트리거 static_assert).

대신 전문화를 사용하여 수정합니다.

template<class TypeList, size_t ElementIndex>
struct at;

template <template<typename...> class TypeList, typename Head, typename... OtherTypes>
struct at<  TypeList<Head, OtherTypes...>,  0>
{
    using type = Head;
};

template <template<typename...> class TypeList, typename Head, typename... OtherTypes, size_t ElementIndex>
struct at<  TypeList<Head, OtherTypes...>,  ElementIndex>
{
    static_assert(ElementIndex < (size_v<   TypeList<Head, OtherTypes...>   >), "at_t : ElementIndex is bigger than list size");

    using type = typename at<  TypeList<OtherTypes...>, ElementIndex - 1   >::type;
};

template <template<typename...> class TypeList, size_t ElementIndex>
struct at<  TypeList<>,  ElementIndex>
{
    static_assert(ElementIndex != ElementIndex, "at_t : ElementIndex is bigger than list size");
};

또는 표준을 사용할 수 있습니다. tuple_element

template<class TypeList, size_t ElementIndex>
struct at;

template <template<typename...> class TypeList, typename... Types, size_t ElementIndex>
struct at<  TypeList<Types...>,  ElementIndex>
{
    static_assert(ElementIndex < (sizeof...(Types)), "at_t : ElementIndex is bigger than list size");

    using type = std::tuple_element_t<ElementIndex, std::tuple<Types...>>;
};

참고 if_else_t로 그냥std::conditional_t

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

목록보기를 바인딩하는 동안 '문자열'유형을 'bool'로 변환 할 수 없습니다.

분류에서Dev

개체를 보유하는 템플릿을 만들 수 없습니다.

분류에서Dev

개체를 보유하는 템플릿을 만들 수 없습니다.

분류에서Dev

auto를 사용하지 않고 템플릿의 반복기에서 변수 유형을 추론합니다.

분류에서Dev

템플릿 인수를 기반으로 유형을 반환하는 C ++ 템플릿 함수

분류에서Dev

템플릿 변수가없는 템플릿 유형 및 이러한 유형을 사용하는 다른 템플릿 유형

분류에서Dev

유형이 아닌 템플릿 매개 변수는 유형을 가질 수 없습니다.

분류에서Dev

링크 된 목록에 대한 노드 유형과 데이터 유형을 모두 전달하려면 템플릿 매개 변수를 사용합니다.

분류에서Dev

invoke_result를 사용하여 템플릿 멤버 함수의 반환 유형을 얻습니다.

분류에서Dev

렌더링하는 동안 TypeError 발생 : 'int'개체는 django 템플릿에서 반복 할 수 없습니다.

분류에서Dev

함수가 구조체 템플릿을 반환 할 때 템플릿 인수를 추론 할 수없는 이유

분류에서Dev

작업 목록이있는 템플릿을 jobList 유형 매개 변수에 전달할 수 있습니까?

분류에서Dev

C ++ 11은 동일한 템플릿 함수의 다른 전문화를 호출하는 템플릿 함수의 구문을 단순화합니다.

분류에서Dev

Blob Storage에서 ARM 템플릿을 배포하는 동안 powershell에서 매개 변수를 전달할 수 없습니다.

분류에서Dev

템플릿 함수 반환 유형에서 중복을 피하는 방법은 무엇입니까?

분류에서Dev

템플릿의 유형을 기반으로 함수를 컴파일하는 방법은 무엇입니까?

분류에서Dev

유형의 인수 목록을 사용하여 'requestAuthorizationToShareTypes'를 호출 할 수 없습니다.

분류에서Dev

'(Unmanaged <CFHTTPMessage>!)'유형의 인수 목록을 사용하여 'CFHTTPMessageCopySerializedMessage'를 호출 할 수 없습니다.

분류에서Dev

Django 템플릿 엔진을 jinja2로 변환하는 동안 오류가 발생하여 'with'를 사용할 수 없습니다.

분류에서Dev

C ++에서 이니셜 라이저 목록에서 기본 클래스의 템플릿 인수를 반복해야하는 이유는 무엇입니까?

분류에서Dev

동일한 함수를 반복적으로 호출하는 동안 jQuery 콜백이 제대로 작동하도록 만들 수 없습니다.

분류에서Dev

다른 유형을 반환하도록 설계된 템플릿 함수를 어떻게 전문화 할 수 있습니까?

분류에서Dev

매개 변수 유형 템플릿 유형의 일반 람다 자동

분류에서Dev

템플릿 인수 유형 조건에 따라 다른 튜플 유형을 반환하는 템플릿 함수 만들기

분류에서Dev

목록을 반복하는 동안 목록을 수정할 수 있습니까?

분류에서Dev

목록을 반복하는 동안 목록에서 유사한 요소를 계산하고 제거합니다.

분류에서Dev

g ++는 기능 맵 구현을위한 템플릿 유형을 추론 할 수 없습니다.

분류에서Dev

템플릿 매개 변수의 유형을 확인하고 다른 템플릿을 사용합니다.

분류에서Dev

목록을 반복하는 동안 for 루프 주위에 괄호를 사용할 수없는 이유는 무엇입니까?

Related 관련 기사

  1. 1

    목록보기를 바인딩하는 동안 '문자열'유형을 'bool'로 변환 할 수 없습니다.

  2. 2

    개체를 보유하는 템플릿을 만들 수 없습니다.

  3. 3

    개체를 보유하는 템플릿을 만들 수 없습니다.

  4. 4

    auto를 사용하지 않고 템플릿의 반복기에서 변수 유형을 추론합니다.

  5. 5

    템플릿 인수를 기반으로 유형을 반환하는 C ++ 템플릿 함수

  6. 6

    템플릿 변수가없는 템플릿 유형 및 이러한 유형을 사용하는 다른 템플릿 유형

  7. 7

    유형이 아닌 템플릿 매개 변수는 유형을 가질 수 없습니다.

  8. 8

    링크 된 목록에 대한 노드 유형과 데이터 유형을 모두 전달하려면 템플릿 매개 변수를 사용합니다.

  9. 9

    invoke_result를 사용하여 템플릿 멤버 함수의 반환 유형을 얻습니다.

  10. 10

    렌더링하는 동안 TypeError 발생 : 'int'개체는 django 템플릿에서 반복 할 수 없습니다.

  11. 11

    함수가 구조체 템플릿을 반환 할 때 템플릿 인수를 추론 할 수없는 이유

  12. 12

    작업 목록이있는 템플릿을 jobList 유형 매개 변수에 전달할 수 있습니까?

  13. 13

    C ++ 11은 동일한 템플릿 함수의 다른 전문화를 호출하는 템플릿 함수의 구문을 단순화합니다.

  14. 14

    Blob Storage에서 ARM 템플릿을 배포하는 동안 powershell에서 매개 변수를 전달할 수 없습니다.

  15. 15

    템플릿 함수 반환 유형에서 중복을 피하는 방법은 무엇입니까?

  16. 16

    템플릿의 유형을 기반으로 함수를 컴파일하는 방법은 무엇입니까?

  17. 17

    유형의 인수 목록을 사용하여 'requestAuthorizationToShareTypes'를 호출 할 수 없습니다.

  18. 18

    '(Unmanaged <CFHTTPMessage>!)'유형의 인수 목록을 사용하여 'CFHTTPMessageCopySerializedMessage'를 호출 할 수 없습니다.

  19. 19

    Django 템플릿 엔진을 jinja2로 변환하는 동안 오류가 발생하여 'with'를 사용할 수 없습니다.

  20. 20

    C ++에서 이니셜 라이저 목록에서 기본 클래스의 템플릿 인수를 반복해야하는 이유는 무엇입니까?

  21. 21

    동일한 함수를 반복적으로 호출하는 동안 jQuery 콜백이 제대로 작동하도록 만들 수 없습니다.

  22. 22

    다른 유형을 반환하도록 설계된 템플릿 함수를 어떻게 전문화 할 수 있습니까?

  23. 23

    매개 변수 유형 템플릿 유형의 일반 람다 자동

  24. 24

    템플릿 인수 유형 조건에 따라 다른 튜플 유형을 반환하는 템플릿 함수 만들기

  25. 25

    목록을 반복하는 동안 목록을 수정할 수 있습니까?

  26. 26

    목록을 반복하는 동안 목록에서 유사한 요소를 계산하고 제거합니다.

  27. 27

    g ++는 기능 맵 구현을위한 템플릿 유형을 추론 할 수 없습니다.

  28. 28

    템플릿 매개 변수의 유형을 확인하고 다른 템플릿을 사용합니다.

  29. 29

    목록을 반복하는 동안 for 루프 주위에 괄호를 사용할 수없는 이유는 무엇입니까?

뜨겁다태그

보관