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 の比較を実装するよりも、基本クラスですべてを比較する方が良いかもしれません。しかし、物事を「オブジェクト指向」に保つことができるかどうかを見たいと思っています。
デザインの問題について何か考えはありますか?
ありがとう。