【C++11】Lambda链式调用

实现一个链式调用的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”

猜你喜欢

转载自blog.csdn.net/gx864102252/article/details/79440303