可变参数模板类扩展

Variadic template class expansion

本文关键字:扩展 变参 参数      更新时间:2023-10-16

我有以下模板类,我想在其中循环浏览模板类型并为每种类型做一些事情。这是一个简化的示例。

template<class... T>
class Handler
{
private:
template<class A>
void Do1_(int a, int b)
{ 
A obj{};
obj.Process(a, b);
}
template<class A, class... B>
void Do_(int a, int b)
{
Do1_<A>(a, b);
Do_<B...>(a, b);
}
public:
void Do(int a, int b)
{
Do_<T...>(a, b);
}
};
struct Foo1 {
void Process(int a, int b) {}
};
struct Foo2 {
void Process(int a, int b) {}
};    
class Bar : public Handler<Foo1, Foo2> {};

但是Do_<B...>的扩展给我带来了麻烦,我在编译Do_<B...>时收到有关"无法推断'A'的模板参数"的编译错误。如果可能的话,正确的扩展应该在这里进行编译。

你把事情复杂化了。这应该可以(没有双关语):

template<class... T>
class Handler
{
public:
void Do(int a, int b) {
int dummy[] = {(T{}.Process(a, b), 0)...};
}
};

演示