2016-11-24 23 views
8

Oczywiście poniższy kod nie jest kompilowany w C++. Ale mam przypadek, w którym chciałbym sparametryzować klasę z zerową lub większą liczbą elementów danych w oparciu o parametry szablonu.Zadeklaruj zmienne składowe z parametru szablonu variadic

Czy mogę zadeklarować klasę, której członkowie zależą od parametrów szablonu wariasu, aby uzyskać dostęp do każdego z nich? lub w inny sposób, aby osiągnąć to, co chciałbym?

To powstało w prawdziwym programie, który rozwiązałem zupełnie inaczej, ale teraz interesuje mnie bardziej abstrakcyjny problem, jak mogłem to zrobić.

template <typename... Types> class Data 
{ 
    // Declare a variable of each type in the parameter pack 
    // This is NOT valid C++ and won't compile... 
    Types... items; 
}; 

struct Item1 
{ 
    int a; 
}; 

struct Item2 
{ 
    float x, y, z; 
}; 

struct Item3 
{ 
    std::string name; 
} 

int main() 
{ 
    Data<Item1, Item2> data1; 
    Data<Item3> data2; 
} 
+1

Zaskakujące jest, to nie wydaje się być duplikatem. – MSalters

Odpowiedz

6

Mogłeś użyć std::tuple

#include <tuple> 

template <typename... Types> class Data 
{ 
    std::tuple<Types...> items; 
}; 

struct Item1 
{ 
    int a; 
}; 

struct Item2 
{ 
    float x, y, z; 
}; 

struct Item3 
{ 
    std::string name; 
}; 

int main() 
{ 
    Data<Item1, Item2> data1; 
    Data<Item3> data2; 
} 

Wypróbuj here

+0

Dzięki, to świetnie. Używam krotki, ale jakoś nie przyszło mi do głowy, że mógłbym jej użyć z rozszerzonym pakietem parametrów. – jcoder

6

Standard obejmuje Cię. Po prostu zadeklaruj std::tuple<Types...> items.

7

To jest cel std::tuple:

template <typename... Types> class Data 
{ 
    std::tuple<Types...> items; 
}; 
+0

Ah dziękuję. To trochę krępujące, używam krotki, ale jakoś nie pomyślałem, żeby użyć jej z rozszerzeniem pakietu parametrów. – jcoder

Powiązane problemy