歪んだ世界
4/1 って事で1発ネタ。
本当はもうちょっと捻ったことをしたかったんだけど別の事をしていたら時間が…。
そんなわけでまるでわたしの心のように歪んだ世界です。
[ソース]
#include <boost/lexical_cast.hpp> #include <boost/range/adaptor/reversed.hpp> #include <iostream> template<typename Left, typename Right> struct reverser{ Left left; Right right; }; template<typename Left, typename Right> reverser<typename std::decay<Left>::type, std::string> reverse(Left&& left, Right&& right){ auto str = boost::lexical_cast<std::string>(right); return { left, std::string(str.rbegin(), str.rend()) }; } template<typename Output, typename Left, typename Right> auto operator >>(reverser<Left, Right> const& r, Output&& output) ->decltype(reverse(r, output)){ return reverse(r, output); } template<typename Output, typename ManipType = std::ostream&(*)(std::ostream&)> auto operator >>(ManipType manip, Output&& output) ->decltype(reverse(manip, output)){ return reverse(manip, output); } template<typename ManipType = std::ostream&(*)(std::ostream&)> std::ostream& operator >>(ManipType manip, std::ostream& os){ os << manip; return os; } template<typename Left, typename Right> std::ostream& operator >>(reverser<Left, Right> const& reverse, std::ostream& os){ os << reverse.right; return reverse.left >> os; } int main(){ std::endl >> std::string("dlrow praw ,olleh") >> std::cout; std::endl >> std::string("41") >> ":" >> "umoh" >> std::cout; // 残念ながらこれはエラーに… // std::endl >> 41.3 >> std::cout; return 0; }