Вы можете обернуть саму карту или , тип значения или , оператор [].
Последняя обёртка будет самой простой:
template <typename T>
std::string& get_default(std::map<T, std::string>& map, const T& key) {
auto it = map.find(key);
if (it == map.end()) {
return map[key] = create_default_value();
} else {
return *it;
}
}
Тип значения не должен быть слишком сложным, либо:
struct default_string {
std::string wrapped_string;
default_string() : wrapped_string(create_default_value()) {}
explicit default_string(const std::string& wrapped_string)
: wrapped_string(wrapped_string) {}
operator const std::string&() const { return wrapped_string; }
operator std::string&() { return wrapped_string; }
};
Обтекание карты займет немного больше времени, так как вам придется дублировать весь интерфейс, включая typedefs. Примечание: этот код не проверен, рассматривайте его как доказательство концепции, чтобы направить вас в правильном направлении.