Следующее действует точно так же, как вы пробовали с помощью приведений:
return typeid(*a1) == typeid(*a2) && a1->GetField() < a2->GetField();
, но охватывало бы, возможно, еще существующий дополнительный дериват D
из A
.
Но так как n314159 , обозначенный в комментариях, у нас есть еще некоторые проблемы:
A* a1 = new B("ad");
A* a2 = new C("ad");
Теперь оба
LessCmp()(a1, a2)
LessCmp()(a2, a1)
дадут false. Таким образом, множество будет интерпретировать их эквивалентно! Мы можем исправить это, хотя:
std::type_index ti1(typeid(*a1));
std::type_index ti2(typeid(*a2));
return ti1 < ti2 || ti1 == ti2 && a1->GetField() < a2->GetField();
Хотя у меня есть некоторые сомнения относительно этого дизайна.
Сначала у вас есть утечка памяти: что происходит со вторым B("TOTO")
экземпляр после того, как не вставить? (Хорошо, ваш исходный код может отличаться, но, как и следовало ожидать, есть утечка ...).
Тогда что отличает B("TOTO")
от C("TOTO")
, но не от другого B("TOTO")
? Я не могу судить, так как не знаю конкретного случая использования, но он оставляет неприятные ощущения в желудке ...