假设我有一个模板函数,它接受可变参数并使用这些参数调用其他函数......
template<typename... A> func(int i, A... args)
{
// do something common
switch (i)
{
case 0: x(args...); break;
case 1: y(args...); break;
case 2: z(args...); break;
default: break;
}
// do something common
}
...而其他功能被定义为...
void x(int a, int b);
void y(int a, int b); // note: takes same args as x()
void z(std::string a);
这不会编译,因为使用 std::string 参数调用 func() 将找不到与带有 std::string 参数的 x() 和 y() 的匹配项。
请注意, func() 使用一些外部标准(本示例中的参数 i 的值)来决定将参数 args 传递给哪个其他函数。
有没有办法在不诉诸于将参数 args 填充到 std:tuple 中并传递它的情况下实现这一目标?
[编辑]
好的,我想出了一种对我的目的来说足够好的方法。这是一个示例类来说明...
class X
{
private:
bool a(int) { return true; }
bool b(int) { return true; }
template<typename... A> bool a(const A&...) { return false; }
template<typename... A> bool b(const A&...) { return false; }
public:
template<typename... A> void x(int i, const A&... args)
{
if (i == 0)
{
a(args...);
}
else
{
b(args...);
}
}
};
a() 和 b() 的可变参数模板方法将捕获对 Xx() 的任何调用,其中参数不是单个 int。这解决了我收到的编译器错误,并启用了我正在寻找的更简单的类 API。