来自可变类型名模板和重载的数据成员
Data members from variadic typename template and overloading
类似于问题 ,但有一个额外的问题:
假设我有 2 个(或多个)结构:
struct A { int a; };
struct B { int b; };
我想制作一个 class 来保存每个动态数组,并且能够调用对其中一种类型进行特定处理:
struct Manager<A, B>
{
std::vector<A> as;
std::vector<B> bs;
template<typename T> process();
};
其中,如果我调用 process<A>
它将遍历所有“as”,并且 process<B>
遍历所有“bs”。
此外,我提供 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);
}
}
};
类似于问题
假设我有 2 个(或多个)结构:
struct A { int a; };
struct B { int b; };
我想制作一个 class 来保存每个动态数组,并且能够调用对其中一种类型进行特定处理:
struct Manager<A, B>
{
std::vector<A> as;
std::vector<B> bs;
template<typename T> process();
};
其中,如果我调用 process<A>
它将遍历所有“as”,并且 process<B>
遍历所有“bs”。
此外,我提供 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);
}
}
};