2011-09-18 5 views
0

データを処理するための関数をいくつか呼び出すアルゴリズムがあります。これらの関数のそれぞれは、同じ変数の多くを共有し操作します。したがって、私は、特にこれらの変数の多くがSTLコンテナであるため、読み込みが非常に困難になることが判明したときに、参照引数の長いリストを含む一連の関数を避けるようにしています。おそらくより良い方法があるかどうかを確認するために、私はちょうど好奇心だ関数を使ってファンクタを呼び出す

class myfunctor { 
private: 
    ... list of shared members ... 

    void A(..args..) { ..do some work on shared members.. } 
    void B(..args..) { ..do some work on shared members.. } 
    void C(..args..) { ..do some work on shared members.. } 

public: 
    void operator()(class1& X, class2& Y) { 
     A(..); 
     .. 
     B(..); 
     .. 
     C(..); 
     ..etc.. 
    } 
}; 

void algorithm(class1& X, class2& Y) { 
    myfunctor obj; 
    obj(X, Y); 
} 

以下のようにその結果、私は、アルゴリズムの作業を実行するためにファンクタを実装し、ファンクタのための機能のラッパーを定義していますすべて同じ変数に依存するいくつかの関数を実装し、これが悪い習慣とみなされているかどうか?

+0

@anon - 。ああ、私は前にそれらに気づいたことがありません。通知をありがとう。 – entitledX

+0

なぜこれを関数ではなくファンクタにするのですか?引数リストが本当に扱いにくい場合は、なぜA(class1&X、class2&Y)、B(class1&X、class2&Y)などはありませんか? – Beta

+0

関数内でXとYはどのように使用されますか?このコードサンプルでは、​​あなたがしようとしていることが非常に不明です。具体的な例を挙げることはできますか?あなたの説明から、関数がメンバ関数でなければならないように思えます。 –

答えて

3

同じ共有データを扱うumpteen関数を使用すると、データをインスタンスデータとして持つクラスのメンバ関数にすることが合理的な選択です。

ただし、“ファンクタ”は、あなたのビーシーの正しい言葉ではありません。

ファンクタは、はるかに単純な関数ポインタのように振る舞う:それは自由にコピーされ、通常、ビューの呼び出し元’ S点から、’がT状態を変更するように見えるのdoesnすることができます。あなたのビーシーは明らかに自由にコピーすることができませんし、状態を変更するように見えます。私は’ dあなたのビーシーは、ステートマシンオブジェクトのように、関数呼び出しによって状態から状態に移ったと言っています。

乾杯& HTH、