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