歪んだ世界

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;
}

[出力]

hello, warp world
homu:14

リテラル値が直接渡すことが出きないのが悔しい…。
来年はもっと面白いことを考えます!

[コンパイラ]

  • g++ (GCC) 4.7.0 20120218 (experimental)
  • clang++ (LLVM) 3.1 20120327(trunk)