首页 > 解决方案 > 以递归方式调用每个元组成员与前一次调用的结果

问题描述

可以说我有一个 tuple 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()

标签: c++templatesc++17variadic-templates

解决方案


我想您可以将std::apply()模板折叠与 lambda 组合如下

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

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

#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;
 }

推荐阅读