首页 文章

在C variadic模板中传递变量参数

提问于
浏览
0

假设我有一个接受变量参数的模板函数,并使用这些参数调用其他函数...

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()的可变参数模板方法将捕获对X.x()的任何调用,其中参数不是单个int . 这解决了我收到的编译器错误,并启用了我正在寻找的更简单的类API .

2 回答

  • 0

    是的,单独进行重载:

    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);
    }
    

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

  • 2

    看一下这篇文章我知道你可以使用 ... 作为参数来告诉你使用的是可变数量的参数 .

    ... syntax in C++

    这是一个评论良好的代码的另一个例子:Functions with Variable Argument Lists in C and C++ using va_list

    我希望这有帮助 .

相关问题