C++ 11。沒有提升。沒有助手類。任何數量的參數。只需std :: function和variadic模板。
template <typename F1, typename F2>
struct function_composition_traits : public function_composition_traits<decltype(&F1::operator()), decltype(&F2::operator())>
{};
template <typename ClassType1, typename ReturnType1, typename... Args1, typename ClassType2, typename ReturnType2, typename... Args2>
struct function_composition_traits<ReturnType1(ClassType1::*)(Args1...) const, ReturnType2(ClassType2::*)(Args2...) const>
{
typedef std::function<ReturnType2(Args1...)> composition;
template <typename Func1, typename Func2>
inline static composition compose(const Func1& f1, const Func2& f2) {
return [f1,f2](Args1... args) -> ReturnType2 { return f2(f1(std::forward<Args1>(args)...)); };
}
};
template <typename F1, typename F2>
typename function_composition_traits<F1,F2>::composition compose(const F1& lambda1,const F2& lambda2)
{
return function_composition_traits<F1,F2>::template compose<F1,F2>(lambda1, lambda2);
}
template <typename F, typename... Fs>
auto compose(F f, Fs... fs) -> decltype(compose(f, compose(fs...)))
{
return compose(f, compose(std::forward<Fs>(fs)...));
}
用法:
auto add = [](int x, int y){ return x+y; };
auto mul = [](int x){ return x*2; };
auto divide = [](int x) { return (double)x/3.0; };
auto test = compose(add, mul, divide);
cout << "Result: " << test(2,3);
輸出:
結果:3.33333
你可以用'提振:: bind',而不是'提高::拉姆達::綁定「這個任務。它看起來像'bind(g,bind(f,_1))'。你知道嗎? – 2010-05-15 20:49:26
是的,您可以使用嵌套調用來'boost :: bind'來創建複合函子。但是,我想知道是否有更好的方法來做到這一點。 – Channel72 2010-05-15 20:57:55