来自可变typename模板和重载的数据成员



类似于问题:从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);
}
}
};

演示