您的位置:首页 > 编程语言 > C语言/C++

【C++】Lambda链式调用

2018-03-04 22:07 561 查看

实现一个链式调用的lambda表达式

首先创建一个task对象,然后连续调用then的函数,只需要保证前一个函数的输出为后一个的输入即可。最后在需要的时候调用计算结果。

代码如下:(参考-深入应用C++代码优化与工程级应用3.3.4节)

template<typename T>
class Task;

template<typename R, typename...Args>
class Task<R(Args...)>
{
public:
Task(std::function<R(Args...)>&& f) : m_fn(std::move(f)) {}
Task(std::function<R(Args...)>& f) : m_fn(f) {}

R run(Args&&... args)
{
return m_fn(std::forward<Args>(args)...);
}

template <typename F>
auto then(F&& f) -> Task<typename std::result_of<F(R)>::type(Args...)>
{
using return_type = typename std::result_of<F(R)>::type;

auto func = std::move(m_fn);
return Task<return_type(Args...)>([func, &f](Args&&...args) {
return f(func(std::forward<Args>(args)...));
});
}

private:
std::function<R(Args...)> m_fn;
};

void tesk()
{
Task<int(int)> task([](int i) {return i; });

auto f = task
.then([](int i) {return i + 1; })
.then([](int i) {return i + 2; })
.then([](int i) {return i + 3; });

auto result = f.run(0);

cout << "run task result:" << result << endl;
}


运行得出结果如下:

“run task result:6”
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++11 C++ lambda