4

loki 유형 목록의 가변 템플릿 래퍼를 구현하려고 시도합니다.두 개의 가변 템플릿을 하나로 병합

로키 스타일의 두 유형리스트를 병합하는 것은 쉽지만 variadic- 템플리트 스타일에서 병합하는 데 문제점이 있습니다.

내 구현입니다 (단순화, push_back, index_of, ..., 메소드없이).

template<typename... Ts> 
struct dl32TypeList; 

template<typename HEAD , typename... TAIL> 
struct dl32TypeList<HEAD,TAIL...> 
{ 
    static const unsigned int size = sizeof...(TAIL) + 1; 

    using value = dl32Loki_like_TypeList<HEAD, typename dl32TypeList<TAIL...>::value>; 
}; 

template<> 
struct dl32TypeList<> 
{ 
    using value = dl32NoType; 

    static const unsignedint size = 0; 
}; 

내가 좋아하는 뭔가를 원하는 :

template<typename OTHER_TYPELIST> 
using merge = dl32TypeList<HEAD , TAIL... , typename OTHER_TYPELIST::???>; 

을 그리고 이것은 문제이다 : 우리는 사용/타입 정의로 가변 인자 템플릿 인수를 저장할 수 없습니다, 그래서 내가이 작업을 수행 할 수있는 방법에 대해 어떤 생각을 가지고있다. (OTHER_TYPELIST :: ???에 유의하십시오.)

+0

전체 사례를 제공해 주시겠습니까? 'dl32Loki_like_TypeList'는'dl32TypeList'를 의미합니까? 'dl32NoType'은 무엇입니까? –

+0

죄송합니다, 정확합니다, 메시지가 너무 짧습니다. dl32는 내 라이브러리 유형의 접두어입니다. dl32TypeList는 loki 형식의 유형 목록의 래퍼입니다 (Alexandrescu의 "Modern C++ desing"에서 설명한 것처럼 dl32_loki_style_typelist는 해당 유형 목록을 구현 한 것입니다). dl32NoType은 의미가없는 유형이며, 기본적으로 유형 조작에 대한 표시입니다. 이 경우 dl32NoType은 입력 목록의 끝을 표시합니다. – Manu343726

+0

@ Manu343726 정말 연구하고 싶지는 않지만 ** C++ 11 **의 네이티브 타입 목록 기능을 사용하여 ** 2001 ** 도서에서 유형 목록을 구현하고 있습니까? 이것은 순전히 운동입니까? C++ 11 파라미터 팩을 C++ 98 구문으로 변환 한 다음 C++ 11 인터페이스를 추가하는 것은 어리석게 복잡합니다. – Potatoswatter

답변

6

Loki 또는 DL32가 무엇인지 알지 못하며, 무엇인가를 구현해야한다는 것이 명확하지 않습니다.

std::tuple은 유형 목록에 대한 일반적인 도구입니다. 런타임 저장소 컨테이너로 설계되었지만 유형이 완료되는 한 컴파일 타임 유틸리티로 작동합니다. 수동으로 수행 할 경우

template< typename ... t > 
struct tuple_cat 
    { typedef decltype(std::tuple_cat(std::declval<t>() ...)) type; }; 

것은, 부분 특수화 시도 : 여기에 사슬로 잇다 튜플 하나의 방법입니다 size 멤버로

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

template< typename ta, typename tb > 
struct type_cat; 

template< typename ... a, typename ... b > 
struct type_cat< type_list< a ... >, type_list< b ... > > 
    { typedef type_list< a ..., b ... > type; }; 

, 당신은 문제를 해결하기 위해 보편적 metafunction을 만들 수 있습니다 한번만.

template<typename> 
struct count_types; 

template< template< typename ... > class t, typename ... a > 
struct count_types< t< a ... > > 
    { static constexpr std::size_t value = sizeof ... a; }; 
+0

감사합니다 !!! 이것은 완벽하게 작동합니다! – Manu343726

+0

사용 방법을 알려주는 코드를 제공해 주시겠습니까? 문법으로 고생하고있다 – makar

+0

@makar 어느 쪽? 별도의 질문을하십시오. 링크가있는 여기에 의견을 게시 할 수는 있지만 답변을 드릴 수는 없습니다. – Potatoswatter

관련 문제