#include<functional>
#include<type_traits>
#include<iostream>
using namespace std;
template<typename Func>
class linktask;
template<typename R,typename ...Args>
class linktask<R(Args...)>
{
public:
linktask(function<R(Args...)>& f):m_fn(f){}
linktask(function<R(Args...)>&& f) :m_fn(std::move(f)) {}
template<typename... ARGS>
R run(ARGS&&...args)
{
return m_fn(std::forward<ARGS>(args)...);
}
template<typename... ARGS>
R operator()(ARGS&&...args )
{
return m_fn(std::forward<ARGS>(args)...);
}
template<typename NewFn>
auto then(NewFn&& fn)
{
//新task返回值类型是 新函数fn类型用上一个返回值类型做参数的调用
using NextResultType = std::invoke_result_t<std::decay_t<NewFn>,R>;
auto func = std::move(m_fn);
//这里有一个隐含依赖:所有task链上的m_fn 的参数与上一个task 的m_fn参数一致
return linktask<NextResultType(Args...)>(
[func, &fn](auto &&...argv) {
return fn(func(std::forward<decltype(argv)>(argv)...));
}
);
}
private:
function<R(Args...)> m_fn;
};
int main()
{
linktask<int(int)> initTask([](int i) {return i; });
auto res=initTask.then([](int i) {return i + 1; }).then([](int i) {return i + 2; }).then([](int i) {return i + 3; })(4);
return 0;
}
C++函数式编程:使用Lambda编程实现调用链
于 2023-06-19 17:19:49 首次发布
该文章展示了一个C++模板类`linktask`,用于构建任务链。`linktask`接受一个函数对象并支持`then`方法来添加后续任务,每个任务的返回值作为下一个任务的输入。在`then`中,新任务由前一个任务的结果创建,形成一个可组合的任务序列。在`main`函数中,展示了如何创建和执行一个任务链,从初始任务到最后的任务,逐步增加操作。
摘要由CSDN通过智能技术生成