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

问题描述 投票:1回答:1

在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中实现类似的非递归映射?

c++ c++14 variadic-templates variadic-functions
1个回答
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) ...);
}

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

© www.soinside.com 2019 - 2024. All rights reserved.