Мне интересно об одном. У меня есть класс, который имеет 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 ::» перед поиском ничего не меняет.
В целом, к сожалению, нет чистого решения для этого.
Вы Можно вызовите перегруженный 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
Вот.
const_cast<const A*>(this)->find(key);