C++ 从可调用变量元组中函数的结果创建元组

C++ 从可调用变量元组中函数的结果创建元组,c++,tuples,variadic,C++,Tuples,Variadic,我试图写以下内容:我有一个包含N个函数的元组作为输入。所有这些函数都可以有不同的返回类型,但只接受同一类型的1个参数。我想把调用每个函数到给定参数的结果放入一个元组中 template <typename AttributeType, typename ...Functions> auto f(std::tuple<Functions...> &tupleOfFunctions, const AttributeType &attr) { return

我试图写以下内容:我有一个包含N个函数的元组作为输入。所有这些函数都可以有不同的返回类型,但只接受同一类型的1个参数。我想把调用每个函数到给定参数的结果放入一个元组中

template <typename AttributeType, typename ...Functions>
auto f(std::tuple<Functions...> &tupleOfFunctions, const AttributeType &attr)
{
  return std::make_tuple(std::get<0>(tupleOfFunctions)(attr), std::get<1>(tupleOfFunctions)(attr), …, std::get<N>(tupleOfFunctions)(attr));
}
模板
自动f(std::tuple和tupleofffunctions、常量AttributeType和attr)
{
返回std::make_tuple(std::get(tupleofffunctions)(attr),std::get(tupleofffunctions)(attr),…,std::get(tupleofffunctions)(attr));
}
好了:

template <typename AttributeType, typename ...Functions>
auto f(std::tuple<Functions...> &tupleOfFunctions, const AttributeType &attr)
{
    return std::apply(
        [&](auto &... f) { return std::tuple{f(attr)...}; },
        tupleOfFunctions
    );
}
模板
自动f(std::tuple和tupleofffunctions、常量AttributeType和attr)
{
返回标准::应用(
[&](auto&…f){return std::tuple{f(attr)…};},
tupleof函数
);
}

这也可以调整为透明地处理引用返回函数:

template <typename AttributeType, typename ...Functions>
auto f(std::tuple<Functions...> &tupleOfFunctions, const AttributeType &attr)
{
    return std::apply(
        [&](auto &... f) { return std::tuple<decltype(f(attr))...>{f(attr)...}; },
        //                                  ^^^^^^^^^^^^^^^^^^^^^^
        tupleOfFunctions
    );
}
模板
自动f(std::tuple和tupleofffunctions、常量AttributeType和attr)
{
返回标准::应用(
[&](auto&…f){return std::tuple{f(attr)…};},
//                                  ^^^^^^^^^^^^^^^^^^^^^^
tupleof函数
);
}

您能在回答中添加更多解释吗?为什么要使用
std::apply
?谢谢。@Pierre好吧,这样更容易。它将
tupleOfffunctions
的元素绑定到
自动&。。。f
参数包,然后可以直接展开。其他解决方案也是可能的,但它们需要做更多的工作来完成同样的扩展(通常是使用一个helper函数和一个
std::index_序列
)。
std::tuple{f(attr)…}
来处理引用类型。@Jarod42我看到了你之前的评论,也有同样的想法(因为,正如我猜您已经意识到的,
std::forward\u as\u tuple
将产生对过期PR值的悬空引用)。感谢您的想法:)是的,
std::forward\u as\u tuple
无法使用,所以我删除了新的注释。