#include <iostream>
#include <functional>
template <class F>
struct pipeable {
private:
F f;
public:
pipeable(F&& f) : f(std::forward<F>(f)) {}
template<class... Xs>
auto operator()(Xs&&... xs) ->
decltype(std::bind(f, std::placeholders::_1, std::forward<Xs>(xs)...))
{
return std::bind(f, std::placeholders::_1, std::forward<Xs>(xs)...);
}
};
template <class F>
pipeable<F> piped(F&& f) {
return pipeable<F>{std::forward<F>(f)};
}
template<class T, class F>
auto operator>>(T&& x, const F& f) -> decltype(f(std::forward<T>(x))) {
return f(std::forward<T>(x));
}
int main() {
auto add = piped([](int x, int y){ return x + y; });
int a = 10 >> add(20) ;
std::cout << a << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnRlbXBsYXRlIDxjbGFzcyBGPgpzdHJ1Y3QgcGlwZWFibGUgewpwcml2YXRlOgogICAgRiBmOwpwdWJsaWM6CiAgICBwaXBlYWJsZShGJiYgZikgOiBmKHN0ZDo6Zm9yd2FyZDxGPihmKSkge30KICAgIHRlbXBsYXRlPGNsYXNzLi4uIFhzPgogICAgYXV0byBvcGVyYXRvcigpKFhzJiYuLi4geHMpIC0+CiAgICAgICAgZGVjbHR5cGUoc3RkOjpiaW5kKGYsIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSwgc3RkOjpmb3J3YXJkPFhzPih4cykuLi4pKQogICAgewogICAgICAgIHJldHVybiBzdGQ6OmJpbmQoZiwgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xLCBzdGQ6OmZvcndhcmQ8WHM+KHhzKS4uLik7CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgRj4KcGlwZWFibGU8Rj4gcGlwZWQoRiYmIGYpIHsKICAgIHJldHVybiBwaXBlYWJsZTxGPntzdGQ6OmZvcndhcmQ8Rj4oZil9Owp9Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBGPgphdXRvIG9wZXJhdG9yPj4oVCYmIHgsIGNvbnN0IEYmIGYpIC0+IGRlY2x0eXBlKGYoc3RkOjpmb3J3YXJkPFQ+KHgpKSkgewogICAgcmV0dXJuIGYoc3RkOjpmb3J3YXJkPFQ+KHgpKTsKfQoKaW50IG1haW4oKSB7CiAgICBhdXRvIGFkZCA9IHBpcGVkKFtdKGludCB4LCBpbnQgeSl7IHJldHVybiB4ICsgeTsgfSk7CiAgICBpbnQgYSA9IDEwID4+IGFkZCgyMCkgOwogICAgc3RkOjpjb3V0IDw8IGEgPDwgc3RkOjplbmRsOwogICAgcmV0dXJuIDA7Cn0=