#include #include #include template class Payload { public: Payload(T data) : argument { data } { } operator T() const { return argument; } private: T argument; }; template Payload payload(T&& data) { return { std::forward(data) }; } template Payload> operator|(Payload const& payload, Callable const& callable) { return { callable(static_cast(payload)) }; } // alternatively using decltype: // // template // auto operator|(Payload const& payload, // Callable const& callable) // -> Payload(payload)))> // { // return { callable(static_cast(payload)) }; // } /** TESTCASES **/ int fun1(std::string const& str) { return std::stoi(str); } char fun2(int x) { return static_cast(x); } struct NextCharacter { char operator()(char c) const { return c + 1; } }; int main() { assert((payload(1) | [](int x) -> double { return 1.5f + x; } | [](double y) -> int { return 2*y; }) == 5); assert((payload("67") | fun1 | fun2) == 'C'); char c { 'a' }; assert((payload(c) | NextCharacter{}) == 'b'); }