7

Variadic variadic şablon şablon parametrelerine sahip olmanın kolay bir yolu var mı? Şimdi bir aşırı yük tespit yapmak Elimizdeki iki Pack s geçmek istiyorsanız Örneğin aşağıdaki işlev imzasıVariadic variadic template şablon parametreleri

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

dikkate Şimdi

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); 

ne Pack nesnelerin değişken sayıda geçmek istiyorsan farklı değişkenlik parametreleri ile örneğin Args0...,Args1...,Args2....

Bu yüzden çizgiler boyunca bir şeyler yapmanın pratik bir yolu var mı diye düşünmekteyim (aşağıdaki taslak çizimdir).

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

"T" ve "Args" ile ne yapmanız gerekir? Muhtemelen 'template 'i kullanarak ve ihtiyacınız olan şeyi çıkarmak için bazı basit özellikler yazarak daha iyi olursunuz. – TartanLlama

+0

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

+0

@Klaus aslında, evet yapabilirsiniz ... [Kendiniz görünün] (http://coliru.stacked-crooked.com/a/1d822071ce2130bf) – Rerito

cevap

5

Ben sadece normal variadic şablonu kullanır:

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

} 

Sonra türünü ve size_t s ayıklamak için bir özellik yazın. Ne istersen onu yapmak için bazı yardımcı takma ad şablonları kolayca ekleyebilirsiniz.

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...>; 
}; 

Sonra foo içinde size argümanları çıkarabilir ve istediğiniz şekilde kullanabilirsiniz. Örneğin, paketler bir std::tuple içeren tüm T s almak için:

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

ben bu şekilde, özyinelemeli Pack argümanları yönetmek için teklif

#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; 
} 

--- Düzen ---

Farklı türlerde ve değişken sayıda std::size_t şablon parametresiyle kullanımı göstermek için değiştirilmiş bir örnek.

+0

olan "Variadic variadic şablon şablon parametreleri parametreleri" – Smeeheey

+0

@Smeeheey - tam olarak: 'std :: size_t' değişken şablon parametresiyle birden çok şablon türüyle çalışır. Altını çizmeye çalışan örneği değiştirdim. Teşekkürler. – max66