#include <iostream>
#include <string>
template <class In, class Out>
struct Pipe
{
typedef In in_type ;
typedef Out out_type ;
In in_val ;
Pipe (const in_type &in_val = in_type()) : in_val (in_val)
{
}
//virtual auto operator () () const -> out_type = 0 ;
virtual auto operator () () const -> out_type
{
return out_type () ;
}
};
template <class In, class Out, class Out2>
auto operator>> (const Pipe <In, Out> &lhs, Pipe <Out, Out2> &rhs) -> Pipe <Out, Out2>&
{
rhs = lhs () ;
return rhs ;
}
template <class In, class Out, class Out2>
auto operator>> (const Pipe <In, Out> &lhs, Pipe <Out, Out2> &&rhs) -> Pipe <Out, Out2>&
{
rhs = lhs () ;
return rhs ;
}
template <class In, class Out>
auto operator>> (const Pipe <In, Out> &lhs, Out &rhs) -> Out&
{
rhs = lhs () ;
return rhs ;
}
template <class In, class Out>
auto operator>> (const Pipe <In, Out> &lhs, Out &&rhs) -> Out&
{
rhs = lhs () ;
return rhs ;
}
struct StringToInt : public Pipe <std::string, int>
{
StringToInt (const std::string &s = "") : Pipe <in_type, out_type> (s)
{
}
auto operator () () const -> out_type
{
return std::stoi (in_val) ;
}
};
struct IntSquare : public Pipe <int, int>
{
IntSquare (int n = 0) : Pipe <in_type, out_type> (n)
{
}
auto operator () () const -> out_type
{
return in_val * in_val ;
}
};
struct DivideBy42F : public Pipe <int, float>
{
DivideBy42F (int n = 0) : Pipe <in_type, out_type> (n)
{
}
auto operator () () const -> out_type
{
return static_cast <float> (in_val) / 42.0f ;
}
};
int main ()
{
float out = 0 ;
StringToInt ("42") >> IntSquare () >> DivideBy42F () >> out ;
std::cout << out << "\n" ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKdGVtcGxhdGUgPGNsYXNzIEluLCBjbGFzcyBPdXQ+CnN0cnVjdCBQaXBlCnsKCXR5cGVkZWYgSW4gaW5fdHlwZSA7Cgl0eXBlZGVmIE91dCBvdXRfdHlwZSA7CgoJSW4gaW5fdmFsIDsKCglQaXBlIChjb25zdCBpbl90eXBlICZpbl92YWwgPSBpbl90eXBlKCkpIDogaW5fdmFsIChpbl92YWwpCgl7Cgl9CgoJLy92aXJ0dWFsIGF1dG8gb3BlcmF0b3IgKCkgKCkgY29uc3QgLT4gb3V0X3R5cGUgPSAwIDsKCgl2aXJ0dWFsIGF1dG8gb3BlcmF0b3IgKCkgKCkgY29uc3QgLT4gb3V0X3R5cGUKCXsKCQlyZXR1cm4gb3V0X3R5cGUgKCkgOwoJfQp9OwoKdGVtcGxhdGUgPGNsYXNzIEluLCBjbGFzcyBPdXQsIGNsYXNzIE91dDI+CmF1dG8gb3BlcmF0b3I+PiAoY29uc3QgUGlwZSA8SW4sIE91dD4gJmxocywgUGlwZSA8T3V0LCBPdXQyPiAmcmhzKSAtPiBQaXBlIDxPdXQsIE91dDI+Jgp7CglyaHMgPSBsaHMgKCkgOwoJcmV0dXJuIHJocyA7Cn0KCnRlbXBsYXRlIDxjbGFzcyBJbiwgY2xhc3MgT3V0LCBjbGFzcyBPdXQyPgphdXRvIG9wZXJhdG9yPj4gKGNvbnN0IFBpcGUgPEluLCBPdXQ+ICZsaHMsIFBpcGUgPE91dCwgT3V0Mj4gJiZyaHMpIC0+IFBpcGUgPE91dCwgT3V0Mj4mCnsKCXJocyA9IGxocyAoKSA7CglyZXR1cm4gcmhzIDsKfQoKdGVtcGxhdGUgPGNsYXNzIEluLCBjbGFzcyBPdXQ+CmF1dG8gb3BlcmF0b3I+PiAoY29uc3QgUGlwZSA8SW4sIE91dD4gJmxocywgT3V0ICZyaHMpIC0+IE91dCYKewoJcmhzID0gbGhzICgpIDsKCXJldHVybiByaHMgOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgSW4sIGNsYXNzIE91dD4KYXV0byBvcGVyYXRvcj4+IChjb25zdCBQaXBlIDxJbiwgT3V0PiAmbGhzLCBPdXQgJiZyaHMpIC0+IE91dCYKewoJcmhzID0gbGhzICgpIDsKCXJldHVybiByaHMgOwp9CgpzdHJ1Y3QgU3RyaW5nVG9JbnQgOiBwdWJsaWMgUGlwZSA8c3RkOjpzdHJpbmcsIGludD4KewoJU3RyaW5nVG9JbnQgKGNvbnN0IHN0ZDo6c3RyaW5nICZzID0gIiIpIDogUGlwZSA8aW5fdHlwZSwgb3V0X3R5cGU+IChzKQoJewoJfQoKCWF1dG8gb3BlcmF0b3IgKCkgKCkgY29uc3QgLT4gb3V0X3R5cGUKCXsKCQlyZXR1cm4gc3RkOjpzdG9pIChpbl92YWwpIDsKCX0KfTsKCnN0cnVjdCBJbnRTcXVhcmUgOiBwdWJsaWMgUGlwZSA8aW50LCBpbnQ+CnsKCUludFNxdWFyZSAoaW50IG4gPSAwKSA6IFBpcGUgPGluX3R5cGUsIG91dF90eXBlPiAobikKCXsKCX0KCglhdXRvIG9wZXJhdG9yICgpICgpIGNvbnN0IC0+IG91dF90eXBlCgl7CgkJcmV0dXJuIGluX3ZhbCAqIGluX3ZhbCA7Cgl9Cn07CgpzdHJ1Y3QgRGl2aWRlQnk0MkYgOiBwdWJsaWMgUGlwZSA8aW50LCBmbG9hdD4KewoJRGl2aWRlQnk0MkYgKGludCBuID0gMCkgOiBQaXBlIDxpbl90eXBlLCBvdXRfdHlwZT4gKG4pCgl7Cgl9CgoJYXV0byBvcGVyYXRvciAoKSAoKSBjb25zdCAtPiBvdXRfdHlwZQoJewoJCXJldHVybiBzdGF0aWNfY2FzdCA8ZmxvYXQ+IChpbl92YWwpIC8gNDIuMGYgOwoJfQp9OwoKaW50IG1haW4gKCkKewoJZmxvYXQgb3V0ID0gMCA7CglTdHJpbmdUb0ludCAoIjQyIikgPj4gSW50U3F1YXJlICgpID4+IERpdmlkZUJ5NDJGICgpID4+IG91dCA7CglzdGQ6OmNvdXQgPDwgb3V0IDw8ICJcbiIgOwoKCXJldHVybiAwIDsKfQo=