Если тип значения не может быть использован по умолчанию, то operator[]
просто не будет работать для вас.
Однако вы можете предоставить бесплатные функции, которые для удобства получают и устанавливают значения на карте.
например:
template <class K, class V>
V& get(std::map<K, V>& m, const K& k)
{
typename std::map<K, V>::iterator it = m.find(k);
if (it != m.end()) {
return it->second;
}
throw std::range_error("Missing key");
}
template <class K, class V>
const V& get(const std::map<K, V>& m, const K& k)
{
typename std::map<K, V>::const_iterator it = m.find(k);
if (it != m.end()) {
return it->second;
}
throw std::range_error("Missing key");
}
template <class K, class V>
void set(std::map<K, V>& m, const K& k, const V& v)
{
std::pair<typename std::map<K, V>::iterator,bool> result = m.insert(std::make_pair(k, v));
if (!result.second) {
result.first->second = v;
}
}
Вы также можете рассмотреть метод получения, подобный dict.get(key [, default])
в Python (который возвращает предоставленное значение по умолчанию, если ключ отсутствует), но при этом возникает проблема с удобством использования в том, что значение по умолчанию всегда должно быть создано, даже если вы знаете, что ключ на карте).