2016-10-23 9 views
6

Mamy klasę szablonu:Szablon atrybut parametr paczka

template<int i> 
class A 
{ 
... 
}; 

Ale jak deklarować pakowacz klas Szablon:

template<int... is> 
Pack 
{ 

private: 
    A<is...> attrs; 
}; 

Albo howto mieć kolekcję klasy A?

Odpowiedz

9

Korzystanie std::tuple, przez przykład

#include <tuple> 

template <int i> 
class A 
{ }; 

template <int... is> 
class Pack 
{ std::tuple<A<is>...> attrs; }; 

int main() 
{ 
    Pack<2,3,5,7,11,13> p; 
} 

Innym sposobem może być w drodze dziedziczenia

template <int i> 
class A 
{ }; 

template <int... is> 
class Pack : A<is>... 
{ }; 

int main() 
{ 
    Pack<2,3,5,7,11,13> p; 
} 
3

Najlepszym podejściem wiem jest użycie listę typu:

template<class...> struct type_list{}; 

template<int...Is> 
using a_pack = type_list<A<Is>...>; 

Z listą typów bardzo łatwo jest wykonać tra nsformation lub wykonaj operację na każdym członku. Na przykład, stwórzmy typ_listę std: wektor z poprzednim kodem:

template<class> struct vectors_of; 

template<class...As> struct vectors_of<type_list<As...>>{ 
    using type=type_list<std::vector<As>...>; 
}; 
using vectors_of_a = typename vectors_of<a_pack<1,2>>::type; 

Ich jest dużo dokumentacji o listach typów. Jest to jedno z podstawowych narzędzi meta-programistów od tej książki: Modern C++ Design (która używa pre-C++ 11). W C++ 11 jest jeszcze łatwiej go używać.

Powiązane problemy