c++ - 以递归方式调用每个元组成员与前一次调用的结果
问题描述
可以说我有一个 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()
?
解决方案
我想您可以将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;
}
推荐阅读
- python - Python如何避免在numpy where子句之后从日期到纳秒的数据类型变化
- r - 我需要使用面板数据获得固定效果的功能建议
- php - Magento 2 管理门户 ERR_TOO_MANY_REDIRECTS
- javascript - 如何在 Cesium Js 中创建一个单独的时钟并使用自定义控件对其进行控制
- python - heroku 错误:由于 EnvironmentError 无法安装软件包:
- reactjs - 防止将 -、+、-、++、+- 粘贴到输入数字中
- nginx - kong api背后的springdoc-openapi-ui
- firebase - Flutter Firestore:“时间戳”类型不是“FieldValue”类型的子类型
- java - Java NIO 选择器 OP_READ 未触发
- reactjs - 如何使用来自 ReactHookForm v6 库的控制器包装器进行 Yup 验证?