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()的输出来调用哪种表达式?
我想你可以将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)