0

この問題にどのように名前を付けるかわからないので、できるだけよく説明しようと思います。

2つの異なるオブジェクトのタイプに応じて戦略を切り替えられるようにしたいと思います。これを機能させるために、オブジェクトに列挙型のフラグを付け、これらの戦略の「レジストリ」(配列)を作成することを考えています。理想的には、2つのタイプ間のビット演算子のような単純な操作で、正しい戦略にアクセスできます。

この擬似コードは、私が説明しようとしていることを理解しやすくする可能性があります。

enum Type { A, B, C }

struct Object {
  Type type;
}

class ActionRunner {
  vector<Strategy> strategies;

  void registerStrategy(type1, type2, strategy) {
    strategies[type1 operator type2] = strategy;
  }

  void runStrategyFor(type1, type2) {
    strategies[type1 operator type2].execute();
  }
}

これはマップを使用して簡単に解決できますが、マップはこのような問題に対してやり過ぎのようであり、配列を使用する方がおそらくはるかに高速であるため、配列またはベクトルを使用したいと思います。

したがって、問題は、正しい戦略の「位置」を選択するためにどの演算子を使用できるかわからないことです。私はいくつかの組み合わせを考えてきましたが、それらすべてが、ある時点で異なる組み合わせとの衝突を引き起こしてしまうようです。

誰かが私がこれに使用できるかもしれないものについての手がかり/アドバイスを持っていますか?

PS:時期尚早の最適化が悪いことは知っていますが、私はこの問題が簡単な方法で解決できるかどうかを理解しようとしています。

- - - - 編集 - - - - - - - - - - - - - - - - - - - - - ------

答えに照らして、私は問題にいくつかの追加の考えを与えてきました、そして私はこの質問で私が意図したことは私が望む方法では不可能であるという結論に達しました。この質問を使用して、現在解決しようとしている問題を言い換えようとします。

特定のタイプのオブジェクト「BaseClass」と、「BaseClass」から派生した2つのオブジェクトを受け取り、それらに対して適切な戦略を実行する「processor」オブジェクトが存在するクラス構造が必要です。このようなもの:

class Processor {
  void run (DerivedA a, DerivedB b);
}

class BaseClass {}
class DerivedA: public BaseClass {}
class DerivedB: public BaseClass {}

BaseClass a = new DerivedA;
BaseClass b = new DerivedB;

processor.run(a, b)

私が理解していることによると、これは、「実行」するためのパラメーターとして渡されるものが参照である場合、私が期待するようには機能しません。あまりにも複雑なコードなしでこれを行う方法はありますか?(トリプルディスパッチ!?)

ダブルディスパッチとスレーブ(プロセッサ)オブジェクトを組み合わせたようなものを考えていますが、それは非常に複雑で、おそらく維持と拡張が面倒です。

ありがとう!

4

2 に答える 2

0

mapこれは、配列の代わりに使用する典型的な例です。配列は、実際にはmap整数として定義されたキーを持つのプライベートケースです。あなたの場合、キーはタプルであるため、単純な配列では機能せず、衝突が発生します(特定の入力に幸運があったとしても、コードは非常に堅牢ではありません)。

2つのタイプが行と列のインデックスとして機能する、 simplearraymap:の中間のソリューションを使用できます。2D array

于 2012-12-21T10:58:18.753 に答える
0

あなたの質問の 2 番目の文は、私に鐘を鳴らしました。

2 つの異なるオブジェクトのタイプに応じて戦略を切り替えることができるようにしたいと考えています。

これは、二重ディスパッチを実行したいようです。C++でこれを実装する方法については、C++ でのダブル ディスパッチ/マルチメソッドの質問 (特に、質問への回答 ;-)) を参照してください。

于 2012-12-21T10:55:40.043 に答える