在可变参数模板中传递参数组

时间:2017-06-13 17:52:29

标签: c++ templates variadic-templates

可变参数模板对于执行递归操作非常有用。在这种情况下,我希望每个递归调用操作两个参数,所以我不必重复调用相同的函数。要做到这一点,我可以写:

f() {}

template<typename M,
         typename N,
         typename... Rest>
f(M arg1, N arg2, Rest... rest)
{
    doStuff(arg1, arg2);
    f(rest);
}

然后我会这样称呼:

f(arg1a, arg1b,
  arg2a, arg2b,
  arg3a, arg3b);

但是,如果调用的格式不是很好,并且所有参数都在一行上,或者列在错误的位置被拆分,那么它就变得非常难以理解了。特别是如果电话可能包含十几对。我试图通过要求传入一对参数包来解决这个问题。我希望函数必须像这样调用:

f({arg1a, arg1b},
  {arg2a, arg2b},
  {arg3a, arg3b});

这似乎主要是失败的,因为初始化列表不会被推断为一对。我可以在每组参数上调用make_pair,但这只是解决了另一个可读性问题的可读性问题。有没有办法让这种调用语法工作?参数对或成对中的参数不同。

2 个答案:

答案 0 :(得分:2)

抱歉,这是不可能的:从支撑列表到用户定义类型的隐式类型转换。唯一可能的转换是**RewriteRule ^index$ index.php [NC,L]** ,但只能针对相同类型或可转换类型进行转换。

有了这个说法,我会提供这个,作为一种可能性,

std::initializer_list

当然,缺点是只为了可读性,你有两个写一些额外的代码(在我看来,这不是一个坏的动机)。

答案 1 :(得分:1)

这可能看起来令人惊讶,但我发现的最佳解决方案实际上是“过去的爆炸”,根本不使用变量。

struct F {
    template <class M, class N>
    F& operator()(M arg1, N arg2) { 
        doStuff(arg1, arg2);
        return *this;
    }
};

F{} (arg1a, arg1b)
    (arg2a, arg2b);

等等。虽然,我还会注意到clang格式不能很好地格式化。所以我最终又做了一些稍微不同的事情。