Не могу передать const указатель const в const ref

Предположим, у вас есть набор указателей (да …):

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, но не как объект, на который он указывает.

Есть ли способ решить это гладко (без изменения установленного типа шаблона)?

12

Решение

Как вы сказали, в функции-члена 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 не буду этого делать

10

Другие решения

Чтобы включить «смешанное» сравнение в заказанном контейнере, вы можете использовать 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;

16

По вопросам рекламы [email protected]