在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中实现类似的非递归映射?
您的原始代码只将一个参数传递给函数。那是因为这个
(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) ...);
}
只是函数参数列表中的常规包扩展。虽然这些调用之间最好没有任何排序要求。逗号运算符具有排序保证,函数参数的评估远不如此。