中获得类似的非恢复映射
在C 17中,折叠式表达式允许您映射参数包,在每个函数中调用成员函数,然后将它们传递到另一个函数之前:
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), ...)
是应用逗号运算符的折叠表达式。它将所有这些成员按顺序调用,但表达式的值只是最后一个调用返回的内容。
假设您要在每个对象上调用成员,然后将所有结果传递到下一个功能,则修复程序还将其变成有效的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) ...);
}
只是函数参数列表中的常规包扩展。尽管最好之间没有任何测序要求。逗号运算符具有测序保证,对函数参数的评估要少得多。