1

Derived1std::vector<std::unique_ptr<Base>> vecと Derivedn (常に Derivedn > Derivedn-1 > ... > Derived1) (n = 10 程度) の間に論理的な比較があり、各 Derivedx がDerivedx との独自の比較です。例として、10 桁の整数 > 9 桁の整数 > 1 桁の整数ですが、各派生クラス内では 53 > 32 と考えてください (ただし、整数の並べ替えは行っていません)。

だから私はこれを行うことができます:

std::sort(vec.begin(), vec.end(), 
[](std::unique_ptr<Base>& const a, std::unique_ptr<Base>& const b){
  return *a<*b;}

そして Base で、関数Base::operator<(const Base& b)に Derived クラスが異なる場合は比較を行い、同じ場合は Derivedx にキャストし、同じ派生クラスの場合は Derivedx にキャストしDerivedx::operator<(const Derivedx& d)ます。

ただし、派生クラスに適切な定義があれば、a と b を自動的に比較できる方法があると思いますが、コンパイル エラーのために実装できませんでした。Derivedx < Derivedy を動的に比較するラムダ関数を取得できません。

私は削除されたコピー代入演算子を使用したと言って、コンパイルエラーを試しBase::operator<(const std::unique_ptr<Base>)てから使用しました(私は理解していません、代入はどこにありますか??)。return *a<b抽象仮想は、 (Derivedx ごとに) 実装し、同じ場合は (Derivedx) にキャストするBase::operator<(const Base& b)必要があるため、現在行っていることと実質的に同じことを行います。Derivedx::operator<(const Base& b)

ただし、(n の派生クラスで n の比較) で n^2 の比較を実装するよりも、基本クラスですべてを比較する方が良いかもしれません。しかし、物事を「オブジェクト指向」に保つことができるかどうかを見たいと思っています。

デザインの問題について何か考えはありますか?
ありがとう。

4

2 に答える 2

3

第 31 章、Scott Meyers の複数のオブジェクトに関して関数を仮想化する、より効果的な C++を参照してください。

また、二重ディスパッチ複数ディスパッチというフレーズをグーグルで検索してみてください。

于 2011-09-20T17:03:29.970 に答える
0

operator<うーん...おそらく、関連するバリアントのセットでオーバーライドすることを使用したでしょう。これは、どのクラス階層からも独立しています。しかし、これはあなたが望むものではないかもしれません。

于 2011-09-21T13:37:11.123 に答える