如何使用成员函数映射参数包? (非递归,预折叠表达式)

时间:2017-12-25 11:25:41

标签: c++ c++14 variadic-templates variadic-functions

在C ++ 17中,fold表达式允许你映射参数包,在每个参数包上调用一个成员函数,然后再将它们传递给另一个函数:

template <typename... Ts>
double func(const Ts&... ts) { ... }

template <typename... Us>
double func2(const Us&... us)
{
    // assume all member_func return types are non-void
    return func((us.member_func(1), ...));
}

是否有可能在C ++ 14中实现类似的非递归映射?

1 个答案:

答案 0 :(得分:3)

您的原始代码只将一个参数传递给函数。那是因为这个

(us.member_func(1), ...)

是应用逗号运算符的fold表达式。它按顺序调用所有这些成员,但表达式的值正是最后一次调用返回的内容。

假设您要在每个对象上调用该成员,并将所有结果传递给下一个函数,该修复程序也将其转换为有效的C ++ 14:

template <typename... Us>
double func2(const Us&... us)
{
    // assume all member_func return types are non-void
    return func(us.member_func(1) ...);
}

只是函数参数列表中的常规包扩展。虽然这些调用之间最好没有任何排序要求。逗号运算符具有排序保证,函数参数的评估远不如此。