Простое решение состоит в том, чтобы сделать std::map
: создать новую запись,
используя конструктор по умолчанию типа значения. Это имеет два
Недостатки: вы не сможете использовать []
на HashMap const
, и вы
не может создать экземпляр HashMap
с типом значения, который не имеет значения по умолчанию
конструктор. Первый более или менее неявный в спецификации,
который говорит, что []
может изменить карту. Есть несколько решений
для второго: самый простой, вероятно, передать экземпляр
значение по умолчанию для конструктора, который сохраняет его и использует для копирования
создайте новый экземпляр, например ::1006
template <typename Key, typename Value>
class HashMap
{
// ...
Value m_defaultValue;
public:
HashMap( ..., Value const& defaultValue = Value() )
: ... , m_defaultValue( defaultValue )...
Value& operator[]( Key& key )
{
// ...
// not found
insert( key, m_defaultValue );
// return reference to newly inserted value.
}
};
Кроме того, вы можете operator[]
вернуть прокси, что-то вроде:
template <typename Key, typename Value>
class HashMap::Helper // Member class of HashMap
{
HashMap* m_owner;
Key m_key;
public:
operator Value&() const
{
if ( ! m_owner->contains( m_key ) )
m_owner->createEntryWithDefaultValue( m_key );
return m_owner->getValue( m_key );
}
Helper& operator=( Value const& newValue ) const
{
m_owner->insert( m_key, newValue );
return *this;
}
};
Обратите внимание, что вам все равно понадобится значение по умолчанию для случая, когда кто-то
пишет:
v = m[x];
и x
отсутствуют на карте. И это такие вещи, как:
m[x].f();
не будет работать. Вы можете только скопировать все значение или присвоить ему.
(Учитывая это, я бы предпочел первое решение в этом случае. Там
Однако существуют и другие случаи, когда прокси-сервер является единственным решением, и мы
жить с этим.)