パックの各タイプにstd::vector
のバリエーションを持つテンプレートテンプレートクラスStore<TArgs...>
をインスタンス化したいとします。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>()];
}
};
私がStore<int, float, double>
を持っているとします。コンパイル時には、int
,float
、double
という値を格納できることは明らかです。
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); }
// ...
};
を...それは手書きのタイプのすべての組み合わせを必要とする、およびユーザー定義型では動作しません:
私はテンプレートの特殊化を使用することができます。
バリエリックテンプレートを使用してStore<int, float, double>
のようなクラスを生成するのに必要なすべてのことをコンパイラが知っていると確信しています - 実際にこのインテントを表現する方法はありますか?
これを行うには 'std :: tuple'が必要です。' std :: vector'は適切ではありません。 –
>> 'std :: array>'、テンプレート引数の順序が間違っています。 'std :: array 'ではなく 'std :: array 'でなければなりません。また、 'std :: vector'ではなく' std :: tuple'が必要だと思います(私は確信していません)。 –
Nawaz