繁体   English   中英

在C ++可变参数模板中传递变量参数

[英]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);
}

(当然,任何其他通用代码都可以分解为一个单独的通用函数,可能是可变参数函数模板。)

看一下这篇文章,我知道您可以使用...作为参数来告诉您正在使用数量可变的参数。

... C ++中的语法

这是另一个代码注释良好的示例: 使用va_list在C和C ++中具有可变参数列表的函数

我希望这有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM