OutputIterator Adaptors

  • OutputIteratorは実装が簡単なので誰かが作っているはずだがあまり見つからない
  • 以下のような感じにする予定
copy(file_range<>("data.txt")|utf8_decoded,
    copier(utf8_encoder|=stream_writer(fout))
    |=copier(transformer(f)|=std::back_inserter(vec1))
    |=std::back_inserter(vec2) );

型がPODかどうかチェックする方法

  • boost::is_podはほとんどのコンパイラで動かないようだ
  • 以下のようにすると少なくとも警告が出せる (Comeauやgccなど)
    • Boost.Xpressiveが利用していると思われる
inline void pod_check(...) {}
struct A {};
struct B : A {};
inline void pod_check_of_AB()
{
    ::pod_check(A());
    ::pod_check(B()); // warning: non-POD class type passed through ellipsis
}

adobe::poly

右結合のpipe

  • 関数呼び出しのシンタックスは醜い
  • f(g(h(x)) を f $ g $ h $ x の様な感じに書けるようにしたい
  • これはpipableを逆にしただけなので、何か右結合のoperator overloadをこの実装に追加すればいい
    • Pipableの概念に組み込むのがいいかもしれない
  • これを使ってOutputIteratorをpipe風にする
    • ぴったりくるoperatorが分からなかった
続きを読む

any_output_iterator

  • OutputIteratorを何でも保持するany_output_iterator (実装)
    • この実装が正しいのかどうか分からない
    • any_iteratorと違うクラスにするのは正しいと思う
std::vector<char> v;
any_output_iterator<char &> oi(std::back_inserter(v));

std::string src("abcdefg");
std::copy(src.begin(), src.end(), oi);

BOOST_CHECK( equals(v, src) );