【发布时间】:2012-12-29 00:02:25
【问题描述】:
假设我有一个模板函数,它接受可变参数并使用这些参数调用其他函数...
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() 的可变参数模板方法将捕获对参数不是单个 int 的 X.x() 进行的任何调用。这解决了我收到的编译器错误,并启用了我正在寻找的更简单的类 API。
【问题讨论】:
-
你必须使用专业化/SFINAE。