Внутри функции вызовите ее перегруженную версию

Мне интересно об одном. У меня есть класс, который имеет 1 перегруженную функцию-член:

class A{
public:
class const_iterator{};
class iterator : public const_iterator{};
iterator find(const K &key);
const_iterator find(const K &key) const;
};

Объявление. Итератор наследуется от const_iterator, но ничего не добавляет.

Что я хочу сделать, так это внутри обычного поиска. Что-то вроде этого:

typename A::iterator A::find(const K &key){
const_iterator it(find(key));
return (*(iterator*)&it);
}

Мне не нужна другая реализация неконстантного поиска банкомата. Можно ли сделать что-то подобное? Потому что теперь я вхожу в бесконечный цикл, добавление «A ::» перед поиском ничего не меняет.

1

Решение

В целом, к сожалению, нет чистого решения для этого.

Вы Можно вызовите перегруженный find просто кастинг this в A const* — но результат будет неправильного типа (const_iterator скорее, чем iterator) и не может быть преобразования между ними в общем случае (ваш (*(iterator*)&it) не будет работать в вашем случае).

Но, конечно, в вашем особом случае, так как вы определили два класса, вы можете определять такое преобразование путем добавления соответствующего конструктора iterator:

class iterator : public const_iterator {
iterator(const_iterator const& other) {
// Construct …
}
};

Тогда вы можете переписать свойconst find реализация следующим образом:

A::iterator A::find(const int &key){
const_iterator it(const_cast<A const*>(this)->find(key));
return static_cast<iterator>(it);
}

Кстати, обратите внимание на отсутствие typename в типе возврата. поскольку A::iterator не является зависимым именем, вам не нужно (и, по крайней мере, в C ++ 03, не разрешено) использовать typename Вот.

2

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

const_cast<const A*>(this)->find(key);
2

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