Предположим, у вас есть набор указателей (да …):
std::set<SomeType*> myTypeContainer;
Затем предположим, что вы хотите найти этот набор из метода const SomeType:
bool SomeType::IsContainered() const
{
return myTypeContainer.find(this) != myTypeContainer.end();
}
Это не работает this
PTR в методе является const SomeType *const
который я не могу положить в find
, Проблема в том, что find
принимает const-ref, что в этом случае означало бы, что переданный указатель обрабатывается как const, но не как объект, на который он указывает.
Есть ли способ решить это гладко (без изменения установленного типа шаблона)?
Как вы сказали, в функции-члена const this
становится const SomeType *
(то есть указатель на const), он не может быть неявно преобразован в SomeType *
(то есть указатель неконстантный), который является ожидаемым типом параметра find
,
Вы могли бы использовать const_cast
выполнить явное преобразование.
bool SomeType::IsContainered() const
{
return myTypeContainer.find(const_cast<SomeType *>(this)) != myTypeContainer.end();
}
Было бы безопасно, если бы результат приведения не использовался для модификации; в то время как std::set::find
не буду этого делать
Чтобы включить «смешанное» сравнение в заказанном контейнере, вы можете использовать key_compare
тип, который объявляет типовое имя key_compare::is_transparent
,
Класс функтора сравнения по умолчанию — std::less<Key>
, Это не «прозрачно». Но std::less<void>
является «прозрачным» и выполняет сравнение любых аргументов a
а также b
пока a<b
хорошо сформирован. Таким образом, вы можете определить свой собственный тип функтора сравнения или вы можете использовать std::less<void>
(или эквивалентно std::less<>
):
set<SomeType*,std::less<>> myTypeContainer;