C++函数式编程:使用Lambda编程实现调用链

该文章展示了一个C++模板类`linktask`,用于构建任务链。`linktask`接受一个函数对象并支持`then`方法来添加后续任务,每个任务的返回值作为下一个任务的输入。在`then`中,新任务由前一个任务的结果创建,形成一个可组合的任务序列。在`main`函数中,展示了如何创建和执行一个任务链,从初始任务到最后的任务,逐步增加操作。
摘要由CSDN通过智能技术生成
#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值