递归调用每个元组成员并返回上一个调用的结果

Dag*_*ago 5 c++ templates variadic-templates c++17

可以说我有一个元组 std::tuple<Operation<1>, Operation<2>, Operation<3>>Operation<>具有带签名的成员函数SomeType someFunction(SomeType)。我想做的是依次调用操作,这样调用的结果顺序将是,Operation<3>::someFunction(Operation<2>::someFunction(Operation<1>::someFunction()))并且我将获得最终SomeType值。如何使用可变参数模板实现此目的(我可以访问C ++ 17)?

我可以使用调用每个成员函数,std::apply([](auto& ...x) { (..., x.someFunction()); }, tuple);但是我需要使用上一个调用someFunction()的输出来调用哪种表达式?

max*_*x66 4

我想你可以将std::apply()模板折叠与 lambda 结合起来,如下所示

   auto l = [&val](auto ... Ops) 
    { ((val = Ops.someFunc(val)), ...); };
Run Code Online (Sandbox Code Playgroud)

以下是一个完整的工作示例

#include <tuple>
#include <iostream>

template <int I>
struct Oper
 {
   static constexpr int someFunc (int i)
    { return i + I; }
 };

int main ()
 {
   std::tuple<Oper<1>, Oper<2>, Oper<3>, Oper<4>>  t;

   int val {}; // starting value

   auto l = [&val](auto ... Ops) 
    { ((val = Ops.someFunc(val)), ...); };

   std::apply(l, t);

   std::cout << val << std::endl;
 }
Run Code Online (Sandbox Code Playgroud)