是否可以将默认构造函数设置为`std :: map <t1,t2 =“”>`values?</t1,>

时间:2011-11-11 13:47:52

标签: c++ stl map std

所以我想创建一个简单的地图std::map<T1, std::string>,我有一个返回std::string的函数我想以某种方式将std :: map中的项目创建与我的函数链接,以便在{{1}时调用我的函数,并将其返回值设置为my_map[some_new_element]键的值。这样的事情有可能吗?怎么做?

2 个答案:

答案 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的构造函数中,您可以定义自定义操作。将项目插入地图时会调用它。