У меня есть класс, который содержит карту
Any& Map::operator[]( const unsigned int field ) const
{
try
{
iterator it;
if ((it = m_fields.find(field)) != m_fields.end())
return it->second;
throw std::runtime_error("Field " + boost::lexical_cast<std::string>(field) + " not found.");
}
catch(boost::bad_any_cast& )
{
throw std::runtime_error("Failed conversion field " + boost::lexical_cast<std::string>(field) + " using boost::any_cast ");
}
}
Я хочу, чтобы оно генерировало исключение, когда поле не существует на карте, поэтому программа не падает при неудачной загрузке, но, похоже, команда throw не работает с перегруженным оператором. бросок или улов игнорируются. Если я использую тот же код, но с общей функцией
Any& Map::get( const unsigned int field ) const
{
//...
это работает.
Я столкнулся с каким-то ограничением c ++ или я что-то не так делаю?
- РЕДАКТИРОВАТЬ:
Я запустил отладчик и, к моему удивлению, код даже не выполняется, другой метод делает
Any& Map::operator[]( const unsigned int field )
{
iterator it;
if ((it = m_fields.find(field)) == m_fields.end())
{
Any newValue;
m_fields[field] = newValue;
return m_fields[field];
}
return it->second;
}
и сбой происходит из-за форсированного утверждения на Any, которое пытается преобразовать неинициализированную переменную. Этот метод, вероятно, используется для вставок на карту, например
Map a;
a[3] = "foo";
Так что, я думаю, у меня нет способа провести различие, когда оператор используется в атрибуции или при получении, а использование этого оператора крайне небезопасно для получения