类似于问题:从variadic模板形参中声明成员变量,但附加一个问题:
假设我有两个(或多个)结构体:
struct A { int a; };
struct B { int b; };
和我想做一个类保存动态数组的每一个,并能够有一个调用做特定的处理这些类型之一:
struct Manager<A, B>
{
std::vector<A> as;
std::vector<B> bs;
template<typename T> process();
};
其中,如果我调用process<A>
,它将循环遍历所有的"as",process<B>
循环遍历所有的">
另外,我提供了A、B或任意数量的结构体(彼此不同)作为可变模板形参。换句话说,做Manager<A, B>
是预期的用途,但做Manager<A, A, B>
是不允许的(因为2 'A')。
这是可能的(并且,如果可能的话,以一种不创建愚蠢的大量样板代码或不可读的方式)?
据我所知,std::tuple
也能完成这项工作:
template <typename... Ts>
struct Manager
{
std::tuple<std::vector<Ts>...> vectors;
template <typename T, typename F>
void process(F f) {
for (auto& e : std::get<std::vector<T>>(vectors)) {
f(e);
}
}
};
演示