【发布时间】:2013-10-28 03:02:09
【问题描述】:
我想实例化一个可变参数模板类 Store<TArgs...>,它在 TArgs... 包中的每种类型都有一个 std::vector。
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<sizeof...(TArgs), std::vector<TArgs...>>,模板参数的顺序错误。它应该是std::array<Type, Size>,而不是std::array<Size, Type>。另外,我认为你需要std::tuple,而不是std::vector(虽然我不确定)。
标签: c++ templates c++11 variadic-templates