Chcę utworzyć instancję klasy szablonów, która ma numer dla każdego typu w zestawie TArgs...
.Argumenty kontenera argumentu macierzy szablonów Variadic
template<typename... TArgs> class Store {
// obviously not valid code
// assuming each type of TArgs... has a `unsigned int` id that can be
// retrieved with getId<T>()
std::array<sizeof...(TArgs), std::vector<TArgs...>> bags;
template<typename T> void add(T mValue) {
bags[getId<T>()].push_back(mValue);
}
template<typename T> std::vector<T>& get() {
return bags[getId<T>()];
}
};
Załóżmy, że mam Store<int, float, double>
. Oczywiście podczas kompilacji wiem, że będzie on w stanie przechowywać wartości int
, float
i .
mogę użyć specjalizacji szablonu:
template<> class Store<int, float, double> {
std::vector<int> vi;
std::vector<float> vf;
std::vector<double> vd;
template<typename T> void add(T);
template<> void add<int>(int mValue) { vi.push_back(mValue); }
template<> void add<float>(float mValue) { vf.push_back(mValue); }
template<> void add<double>(double mValue) { vd.push_back(mValue); }
// ...
};
... ale to wymagałoby ręcznie pisanie każdej możliwej kombinacji typów i nie będzie działać z typów zdefiniowanych przez użytkownika.
Jestem pewien, że kompilator wie wszystko, co jest wymagane do wygenerowania klasy, takiej jak Store<int, float, double>
przy użyciu szablonów variadic - czy istnieje sposób na wyrażenie tego zamiaru?
Będziesz potrzebował 'std :: tuple', aby to zrobić,' std :: vector' nie jest odpowiedni. –
Tutaj >> 'std :: array>', kolejność argumentów szablonu jest niepoprawna. Powinien to być 'std :: array ', a nie 'std :: array '. Ponadto, myślę, że potrzebujesz 'std :: tuple', a nie' std :: vector' (nie jestem pewien). –
Nawaz