...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

boost::algorithm::find

#include <iostream>
#include <boost/algorithm.hpp>
using namespace std;
struct SimpleFinder
{
    // ???
};
void main()
{
    string s("This is a pen.");
    cout << boost::algorithm::find(s, SimpleFinder()) << endl;
    // 両端を除いた"his is a pen"と出力
}

あー,Finder Concept に則った関数オブジェクトの書き方がわかんね.どうなってんだこれ.

なんだよ!

#include <boost/range.hpp>
struct SimpleFinder
{
    template<typename ForwardIteratorT>
    boost::iterator_range<ForwardIteratorT> operator()(ForwardIteratorT Begin, ForwardIteratorT End )
    {
        return boost::make_iterator_range(Begin+1, End-1);
    }
};

ここ見てた.

boost::make_range()とかどこにあるのよ?
ForwardIteratorT じゃなくて一カ所 ForwardIterator になってるし(Tが足りない).
もうちょっと複雑な処理はどうやるのかな.
まともなドキュメントはないのか.

なんたらConceptがわかりにくい

// 最後の空白より後ろだけの範囲を返すFinder関数オブジェクト
struct SimpleFinder
{
    template<typename ForwardIteratorT>
    iterator_range<ForwardIteratorT> operator()(ForwardIteratorT begin, ForwardIteratorT end)
    {
        ForwardIteratorT s, e = end;
        for (ForwardIteratorT iter = begin; iter != end; ++iter)
        {
            if (*iter == ' ')
            {
                s = iter + 1;
            }
        }
        return boost::make_iterator_range(s, e);
    }
};

うん,なるほど.ちょっとだけわかった.ForwardIteratorT == string::iterator か.iterator_range は1組のイテレータをRangeとして扱う型でいいのかな.
テンプレートをバリバリ使ったライブラリを使うときって,テンプレート引数を自分で直接与えるわけじゃないから,どんな型が来るのかを丁寧に説明してくれる文書がないと難しいなー.それは要するにどんな Concept なのかということなんだけど.Concept そのものの概念もあまり一般的ではないからなあ.