Я хочу создать пользовательский метод сравнения для std :: set, который использует кешированные значения охватывающего класса (в котором задан набор).В C++, как позволить (вложенному) функтору сравнения ссылаться на данные охватывающего класса?
Я знаю, что в C++ нет прямого доступа из вложенного класса к охватывающему классу и что вам нужно сохранить указатель во вложенном классе (так как несколько вопросов/ответов на SO уже хорошо объяснены).
Но мой вопрос заключается в том, как вы импортируете такой указатель (pModel в моем скелете кода) в функции сравнения?
Мой код скелет:
using namespace std;
class Face;
class Model
{
public:
// ...
map<Face, double> areaCached;
double area(Face f)
{
if (areaCached.find(f) == areaCached.end())
{
double calculatedValue; // perform very expensive calculation
areaCached[f] = calculatedValue;
}
return areaCached[f];
}
struct CompareByArea
{
// how can I import the pModel pointer here?
bool operator() (const Face f1, const Face f2) const
{
return pModel->area(f1) < pModel->area(f2);
}
};
set<Face, CompareByArea> sortedFaces;
};
Надеюсь, вы понимаете, что изменение модели аннулирует набор 'sortedFaces', и вам нужно будет очистить его и полностью воссоздать? – Slava
Да, абсолютно .. любая смена модели может добавить лица или изменить площадь лиц. Поэтому изменения модели должны приводить к аннулированию всех видов кэшированной информации (например, sortedFaces) .. но спасибо за указание в любом случае! –