7

가변 변수 템플릿 템플릿 매개 변수를 사용하는 간단한 방법이 있습니까? 우리가 지금 과부하를 어떻게 우리가이 Pack의를 통과하려면 예를 들어 다음과 같은 함수 서명을가변 변수 템플릿 템플릿 매개 변수

template<template<typename,size_t...> class Pack, 
    typename T, size_t ... Args> 
void foo(const Pack<T,Args...>& a); 

을 고려 이제

template<template<typename,size_t...> class Pack, 
    typename T, size_t ... Args0, size_t ... Args1> 
void foo(const Pack<T,Args0...>& a, const Pack<T,Args1...>& b); 

우리는 Pack의 객체의 변수 번호를 전달하려면 다른 variadic 매개 변수 예 : Args0...,Args1...,Args2....

나는 선을 따라 뭔가를하는 실용적인 방법이 있다면 생각했다. (다음은 분명 스케치 표현이다.)

template<template<typename,size_t...> ... class Pack, typename T,...> 
void foo(const Pack<T,...> ... packs); 
+0

'T'와'Args'로 무엇을해야합니까? 아마도'template '를 사용하고 당신이 필요로하는 것을 추출하기 위해 간단한 특성을 쓰는 것이 나을 것입니다. – TartanLlama

+0

..... lol .....? : D –

+0

@Klaus 실제로, 그렇습니다 ... [직접보십시오] (http://coliru.stacked-crooked.com/a/1d822071ce2130bf) – Rerito

답변

5

난 그냥 보통의 가변 인자 템플릿을 사용 :

template<typename... Ts> 
void foo(const Ts&... packs) { 

} 

가 그런 종류와 size_t의를 추출하는 특성을 작성합니다. 당신은 당신이 좋아하는 것을하기 위해 쉽게 도우미 별칭 템플릿을 추가 할 수 있습니다.

template <typename T> struct extract_args; 

template <template <typename, size_t...> class Pack, typename T, size_t... Args> 
struct extract_args<Pack<T,Args...>> { 
    using type = T; 
    using args = std::index_sequence<Args...>; 
}; 

foo 내에서 인수를 추출하여 원하는대로 사용할 수 있습니다. 예를 들어, 팩에서 std::tuple 포함하는 모든 T의를 얻을 수 :

using all_ts = std::tuple<typename extract_args<Ts>::type...>; 
3

내가 이런 식으로, 당신이 반복적으로 Pack 인수를 관리하기 위해 제안

#include <array> 

template <typename T, std::size_t ... Args> 
struct testS 
{ }; 

void foo() 
{ /* terminal iteration */ } 

template <template <typename, std::size_t...> class Pack, 
      typename T, std::size_t ... Args, typename ... Packs> 
void foo (const Pack<T, Args...> pack0, Packs ... packs) 
{ 
    // do something with pack0 

    foo(packs...); 
} 

int main() 
{ 
    foo(testS<int>{}, std::array<long, 5U>{}, testS<char, 7U, 9U, 11U>{}); 

    return 0; 
} 

--- 편집 ---

다른 유형과 변수 번호 std::size_t 템플릿 매개 변수의 사용을 보여주는 수정 된 예입니다.

+0

이 솔루션은 실제로 꽤 잘 작동합니다. 'std :: array'와 달리) 하나 이상의'size_t' 템플릿 매개 변수를 사용하는 것을 포함하여 여러 템플릿 유형으로'foo'를 호출 할 수 있습니다. – Smeeheey

+0

@Smeeheey - 정확히 : 가변적 인'std :: size_t' 수의 템플릿 매개 변수를 가진 다중 템플릿 유형과 작동합니다. 밑줄을 긋게하려고하는 예제를 수정했습니다. 감사. – max66