ファンクタがよくわからぬ

なんか、コールバックのうまい実装方法ないかなーと思って探してたら、
ファンクタ利用するといいよ!ってどこかに書いてあった(気がした)。

正直ファンクタをあんまりわかってない自分がいるわけですが、
ファンクタってoperator()オーバーロードしただけのクラス?
それじゃ普通にコールバック用の基底クラスと仮想関数つくって、
ポーリングさせて準備できたらその関数呼び出せばいいんじゃね?
とか思ってた。

この時はファンクタはコールバックに利用するための機能かと思ってた。

なんでoperator()をオーバーロードする必要があるのかよくわからなくて、いろいろさまよってたら、
Wikiに載ってる例見てひらめいた。

class compare_class {
  public:
  bool operator()(int A, int B) {
    return (A < B);
  }
};
...
// C++ の並べ替え関数の定義
template <class ComparisonFunctor> 
void sort_ints(int* begin_items, int num_items, ComparisonFunctor c);
...
int main() {
    int items[] = {4, 3, 1, 2};
    compare_class functor;
    sort_ints(items, sizeof(items)/sizeof(int), functor);
}
関数オブジェクト - Wikipedia

要は、compare_classであるComparisonFunctor cが、
普通の関数と同じように、
c()で振る舞えるのがうれしいってことか。
それで関数オブジェクト=ファンクタって言うわけね。

正解かどうかわからんから時間がある時に書いてみる。
まずはバグをつぶさねば。

(しかし、この設定は改行による行間空けが反映されなくて困るな。)