所以我想创建一个简单的地图std::map<T1, std::string>
,我有一个返回std::string
的函数我想以某种方式将std :: map中的项目创建与我的函数链接,以便在{{1}时调用我的函数,并将其返回值设置为my_map[some_new_element]
键的值。这样的事情有可能吗?怎么做?
答案 0 :(得分:3)
您可以将地图本身或包装为值类型或运算符[]。
最后一个包装器将是最简单的:
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; }
};
包装地图需要更多工作,因为您必须复制整个界面,包括typedef。注意:此代码未经过测试,将其视为概念验证,以引导您朝着正确的方向前进。
答案 1 :(得分:2)
std::string
的小包装类怎么样?
class StringWrapper {
StringWrapper() { //... your code
}
operator std::string&() { return m_string; } // or something like that
private:
std::string m_string;
};
现在使用以下map-type:
std::map<T1, StringWrapper> mymap;
在StringWrapper
的构造函数中,您可以定义自定义操作。将项目插入地图时会调用它。