1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | #include <iostream> #include <vector> #include <boost/shared_ptr.hpp> #include <boost/utility/enable_if.hpp> #include <boost/type_traits.hpp> class IPrinter { public: virtual ~IPrinter() {} virtual std::ostream& print(std::ostream&) const = 0; }; class StupidHelper { std::vector<boost::shared_ptr<IPrinter> > printables; public: template <class T, class U> StupidHelper(const T& a, const U& b); std::ostream& operator>> (std::ostream& os); template <class T> StupidHelper& operator>> (const T& a); }; class Weirdo { int n; public: Weirdo(int n):n(n) {} std::ostream& operator >>(std::ostream& os) const { return os << n; } template <class T> StupidHelper operator >> (const T& rhv) const { return StupidHelper(*this, rhv); } }; template <class T> class Printer: public IPrinter { const T* value; public: Printer(const T& t): value(&t) {} std::ostream& print(std::ostream& os) const { return os << *value; } }; template <> class Printer<Weirdo>: public IPrinter { const Weirdo* value; public: Printer(const Weirdo& w): value(&w) {} std::ostream& print(std::ostream& os) const { return *value >> os; } }; template <class T> typename boost::disable_if<boost::is_same<T, StupidHelper>, StupidHelper>::type operator>>(const T& a, Weirdo& b) { return StupidHelper(a, b); } template <class T, class U> StupidHelper::StupidHelper(const T& a, const U& b) { printables.push_back(boost::shared_ptr<IPrinter>(new Printer<T>(a))); printables.push_back(boost::shared_ptr<IPrinter>(new Printer<U>(b))); } template <class T> StupidHelper& StupidHelper::operator>> (const T& a) { printables.push_back(boost::shared_ptr<IPrinter>(new Printer<T>(a))); return *this; } std::ostream& StupidHelper::operator>> (std::ostream& os) { for (unsigned i = 0; i < printables.size(); ++i) { printables[i]->print(os); } return os; } int main() { Weirdo a(1), b(2), c(3); "These are printed left to right: a = " >> a >> ", b = " >> b >> " and c = " >> c >> '\n' >> std::cout; } |
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CiNpbmNsdWRlIDxib29zdC91dGlsaXR5L2VuYWJsZV9pZi5ocHA+CiNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy5ocHA+CmNsYXNzIElQcmludGVyCnsKcHVibGljOgogICB2aXJ0dWFsIH5JUHJpbnRlcigpIHt9CiAgIHZpcnR1YWwgc3RkOjpvc3RyZWFtJiBwcmludChzdGQ6Om9zdHJlYW0mKSBjb25zdCA9IDA7Cn07CgpjbGFzcyBTdHVwaWRIZWxwZXIKewogICAgc3RkOjp2ZWN0b3I8Ym9vc3Q6OnNoYXJlZF9wdHI8SVByaW50ZXI+ID4gcHJpbnRhYmxlczsKcHVibGljOgogICAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+CiAgICBTdHVwaWRIZWxwZXIoY29uc3QgVCYgYSwgY29uc3QgVSYgYik7CgogICAgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcj4+IChzdGQ6Om9zdHJlYW0mIG9zKTsKCiAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KICAgIFN0dXBpZEhlbHBlciYgb3BlcmF0b3I+PiAoY29uc3QgVCYgYSk7Cn07CgpjbGFzcyBXZWlyZG8KewogICAgaW50IG47CnB1YmxpYzoKICAgIFdlaXJkbyhpbnQgbik6bihuKSB7fQogICAgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA+PihzdGQ6Om9zdHJlYW0mIG9zKSBjb25zdAogICAgewogICAgICAgIHJldHVybiBvcyA8PCBuOwogICAgfQogICAgdGVtcGxhdGUgPGNsYXNzIFQ+CiAgICBTdHVwaWRIZWxwZXIgb3BlcmF0b3IgPj4gKGNvbnN0IFQmIHJodikgY29uc3QKICAgIHsKICAgICAgICByZXR1cm4gU3R1cGlkSGVscGVyKCp0aGlzLCByaHYpOwogICAgfQp9OwoKCnRlbXBsYXRlIDxjbGFzcyBUPgpjbGFzcyBQcmludGVyOiBwdWJsaWMgSVByaW50ZXIKewogICAgY29uc3QgVCogdmFsdWU7CnB1YmxpYzoKICAgIFByaW50ZXIoY29uc3QgVCYgdCk6IHZhbHVlKCZ0KSB7fQogICAgc3RkOjpvc3RyZWFtJiBwcmludChzdGQ6Om9zdHJlYW0mIG9zKSBjb25zdCB7IHJldHVybiBvcyA8PCAqdmFsdWU7IH0KfTsKCnRlbXBsYXRlIDw+CmNsYXNzIFByaW50ZXI8V2VpcmRvPjogcHVibGljIElQcmludGVyCnsKICAgIGNvbnN0IFdlaXJkbyogdmFsdWU7CnB1YmxpYzoKICAgIFByaW50ZXIoY29uc3QgV2VpcmRvJiB3KTogdmFsdWUoJncpIHt9CiAgICBzdGQ6Om9zdHJlYW0mIHByaW50KHN0ZDo6b3N0cmVhbSYgb3MpIGNvbnN0CiAgICB7CiAgICAgICAgcmV0dXJuICp2YWx1ZSA+PiBvczsKICAgIH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBUPgp0eXBlbmFtZSBib29zdDo6ZGlzYWJsZV9pZjxib29zdDo6aXNfc2FtZTxULCBTdHVwaWRIZWxwZXI+LCBTdHVwaWRIZWxwZXI+Ojp0eXBlIG9wZXJhdG9yPj4oY29uc3QgVCYgYSwgV2VpcmRvJiBiKQp7CiAgICByZXR1cm4gU3R1cGlkSGVscGVyKGEsIGIpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4KU3R1cGlkSGVscGVyOjpTdHVwaWRIZWxwZXIoY29uc3QgVCYgYSwgY29uc3QgVSYgYikKewogICAgcHJpbnRhYmxlcy5wdXNoX2JhY2soYm9vc3Q6OnNoYXJlZF9wdHI8SVByaW50ZXI+KG5ldyBQcmludGVyPFQ+KGEpKSk7CiAgICBwcmludGFibGVzLnB1c2hfYmFjayhib29zdDo6c2hhcmVkX3B0cjxJUHJpbnRlcj4obmV3IFByaW50ZXI8VT4oYikpKTsKfQoKCnRlbXBsYXRlIDxjbGFzcyBUPgpTdHVwaWRIZWxwZXImIFN0dXBpZEhlbHBlcjo6b3BlcmF0b3I+PiAoY29uc3QgVCYgYSkKewogICAgcHJpbnRhYmxlcy5wdXNoX2JhY2soYm9vc3Q6OnNoYXJlZF9wdHI8SVByaW50ZXI+KG5ldyBQcmludGVyPFQ+KGEpKSk7CiAgICByZXR1cm4gKnRoaXM7Cn0KCnN0ZDo6b3N0cmVhbSYgU3R1cGlkSGVscGVyOjpvcGVyYXRvcj4+IChzdGQ6Om9zdHJlYW0mIG9zKQp7CiAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcHJpbnRhYmxlcy5zaXplKCk7ICsraSkgewogICAgICAgIHByaW50YWJsZXNbaV0tPnByaW50KG9zKTsKICAgIH0KICAgIHJldHVybiBvczsKfQoKaW50IG1haW4oKQp7CiAgICBXZWlyZG8gYSgxKSwgYigyKSwgYygzKTsKICAgICJUaGVzZSBhcmUgcHJpbnRlZCBsZWZ0IHRvIHJpZ2h0OiBhID0gIiA+PiBhID4+ICIsIGIgPSAiID4+IGIgPj4gIiBhbmQgYyA9ICIgPj4gYyA+PiAnXG4nID4+IHN0ZDo6Y291dDsKfQoK
-
upload with new input
-
result: Success time: 0s memory: 2864 kB returned value: 0
These are printed left to right: a = 1, b = 2 and c = 3


