ソートに渡すコンパレータ

ライブラリを書くときは名前の衝突を回避するため構造体か名前空間にくるんで書くことにしているけど、蟻本を参考にSuffixArrayを構造体で書いてみたら困ったことがあった。

struct Foo{
    int as[10], ids[10];

    bool cmp(int i, int j){
        return  as[i] < as[j];
    }

    Foo(int xs[]){
         memcpy(as, xs, sizeof(as));
         for(int i=0; i<10; i++){
             ids[i] = i;
         }
         sort(ids, ids+10, cmp);
    }
};

みたいな書き方をしたら、sortの第3引数はstaticじゃなきゃダメだとか言われてコンパイル通らなかった。ググってみたら以下のようにすれば解決するらしい。

struct Foo{
    int as[10], ids[10];

    bool cmp(int i, int j){
        return  as[i] < as[j];
    }

    struct sorter{
        Foo *foo;
        sorter(Foo *foo):foo(foo){}
        bool operator()(int i, int j){
            return s->cmp(i, j);
        }
    }

    sorter srt;

    Foo(int xs[]):srt(sorter(this)){
         memcpy(as, xs, sizeof(as));
         for(int i=0; i<10; i++){
             ids[i] = i;
         }
         sort(ids, ids+10, srt);
    }
};

みたいにしないとダメらしい。面倒くさい…。