Если вы хотите максимально использовать полиморфизм, вы должны написать компаратор только для shared_ptr<base>&
, если это может удовлетворить ваши потребности. Вы должны переопределить виртуальную функцию в базовом классе, которую вы будете использовать, чтобы получить сортируемое значение в производном классе, а затем вызвать ее полиморфно в компараторе shared_ptr<base>&
.
Вот краткий пример. Я немного изменил ваш код, чтобы продемонстрировать:
#include <algorithm>
#include <memory>
#include <vector>
#include <iostream>
using namespace std;
class base {
public:
virtual int GetValue() = 0;
static bool cmp(shared_ptr<base>& d1, shared_ptr<base>& d2) {
return d1->GetValue() < d2->GetValue();
}
};
class derived : public base {
public:
int val;
derived(int v) {
val = v;
}
virtual int GetValue() {
return val;
}
};
class derived2 : public base {
public:
int val;
derived2(int v) {
val = v;
}
virtual int GetValue() {
return val / 2 + 10;
}
};
int main() {
vector<shared_ptr<base>> vec1;
vec1.push_back(make_shared<derived>(1));
vec1.push_back(make_shared<derived2>(2));
vec1.push_back(make_shared<derived>(3));
sort(vec1.begin(), vec1.end(), base::cmp);
for (int i = 0; i < vec1.size(); ++i) {
cout << vec1[i]->GetValue() << ' ';
}
cout << endl;
system("pause");
return 0;
}