У меня есть простой вопрос относительно const_cast
и наилучших практик, касающихся контейнеров STL. Рассмотрим следующее, когда класс Foo
имеет собственный STL std::map
от Widget*
до int
:
Декларация:
#include <map>
using std::map;
class Widget;
class Foo {
public:
Foo(int n);
virtual ~Foo();
bool hasWidget(const Widget&);
private:
map<Widget*,int> widget_map;
};
Определение:
#include <map>
#include "Foo.h"
#include "Widget.h"
using std::map;
Foo::Foo(int n)
{
for (int i = 0; i < n; i++) {
widget_map[new Widget()] = 1;
}
}
Foo::~Foo()
{
map<Widget*, int>::iterator it;
for (it = widget_map.begin(); it != widget_map.end(); it++) {
delete it->first;
}
}
bool Foo::hasWidget(const Widget& w)
{
map<Widget*, int>::iterator it;
it = this->widget_map.find(const_cast<Widget*>(&w));
return ( ! ( it == widget_map.end() ) );
}
Учитывая, что hasWidget
принимает в качестве параметра ссылку на const, константность необходимо отбрасывать при вызове map::find
(wiget_map
от Wiget*
до int
). Насколько я могу судить, такой подход является разумным и желательным, но я не хочу принимать его как таковой без обратной связи от более опытных программистов на C ++.
Мне кажется, что это один из немногих случаев правильного использования const_cast
, учитывая, что мы передаем результат приведения в метод STL. Я прав?
Я понимаю, что другие перестановки этого вопроса уже были заданы (например, const_cast для вектора с объектом ), но, похоже, ни одна из них не имеет прямого отношения к вышеупомянутому.
Заранее спасибо.