私が正しく理解していれば、あなたはそのようなものを持っています:
class Base {
public:
int getParam1() const { ... };
virtual void foo() =0; // this is an abstract class
virtual ~Base() { ... }
}
class Derived : public Base {
public:
int getParam1() const { ... }
int getParam2() const { ... }
}
そして、あなたはstd::list<Base*> myList
どこかにいます。初めてリストを並べ替えるときは、次のようにします。
sort(list.begin(),list.end(),[](const Base*v1,const Base*v2) {
return v1->getParam1()<v2->getParam1();
});
また、2番目の並べ替えでは、クラスに固有の何かを使用する必要がありますDerived
。getParam2()
純粋な仮想アクセサーをに追加してBase
実装する必要はありませんDerived
。ただし、リストに派生オブジェクトのみが含まれていることがわかっている場合は、キャストを問題なく使用できます。
sort(list.begin(),list.end(),[](const Base*b1,const Base*b2) {
const Derived * d1 = dynamic_cast<const Derived*>(b1);
const Derived * d2 = dynamic_cast<const Derived*>(b2);
return d1->getParam2() < d2->getParam2();
});
リストのオブジェクトが、でない場合はDerived
、dynamic_castが返さnullptr
れるため、安全に確認できます。