Voglio istanziare una classe modello variadica Store<TArgs...>
che ha un per ogni tipo nel pacchetto TArgs...
.Variabile modello classe argomento istanza contenitori
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>()];
}
};
Diciamo che ho un Store<int, float, double>
. Ovviamente, al momento della compilazione, so che sarà in grado di memorizzare i valori int
, float
e double
.
ho potuto utilizzare specializzazioni modello:
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); }
// ...
};
... ma che richiederebbe ogni possibile combinazione di tipi di scrittura a mano, e non avrebbe funzionato con i tipi definiti dall'utente.
Sono sicuro che il compilatore conosce tutto ciò che è necessario per generare una classe come Store<int, float, double>
utilizzando modelli variadic - esiste un modo per esprimere effettivamente questo intento?
Avrai bisogno di una 'std :: tuple' per fare ciò,' std :: vector' non è adatto. –
Qui >> 'std :: array>', l'ordine degli argomenti del modello è errato. Dovrebbe essere 'std :: array ', non 'std :: array '. Inoltre, penso che tu abbia bisogno di 'std :: tuple', non' std :: vector' (non sono sicuro però). –
Nawaz