C++链式实现比较复杂,目前只在PPL中出现
#include <vector>
#include <iostream>
#include <algorithm>
#include <type_traits>
#include <functional>
using namespace std;
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 testTask() {
Task<int(int)> task([](int i){return i;});
auto result = task
.Then([](int i) {
return i + 1;
})
.Then([](int i) {
return i + 2;
})
.Then([](int i) {
return i + 3;
})
.run(1);
cout << result << endl; // 7
}
int main() {
testTask();
return 0;
}