[英]Passing variable arguments in a C++ variadic template
假设我有一个模板函数,它接受变量参数并使用这些参数调用其他函数...
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的Xx()的任何调用。 这解决了我收到的编译器错误,并启用了我正在寻找的更简单的类API。
是的,进行单独的重载:
template <typename A1>
func(A1 arg1)
{
x(arg1);
}
template <typename A1, typename A2>
func(A1 arg1, A2 arg2)
{
y(arg1, arg2);
}
template <typename A1, typename A2, typename A3>
func(A1 arg1, A2 arg2, A3 arg3)
{
z(arg1, arg2, arg3);
}
(当然,任何其他通用代码都可以分解为一个单独的通用函数,可能是可变参数函数模板。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.