可变参数模板对于执行递归操作非常有用。在这种情况下,我希望每个递归调用操作两个参数,所以我不必重复调用相同的函数。要做到这一点,我可以写:
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,但这只是解决了另一个可读性问题的可读性问题。有没有办法让这种调用语法工作?参数对或成对中的参数不同。
答案 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格式不能很好地格式化。所以我最终又做了一些稍微不同的事情。