【问题标题】:Is it possible to set default constructor to `std::map<T1, T2>` values?是否可以将默认构造函数设置为 `std::map<T1, T2>` 值?
【发布时间】:2011-11-11 13:47:51
【问题描述】:

所以我想创建一个简单的映射 std::map&lt;T1, std::string&gt; 并且我有一个返回 std::string 的函数被调用并将其返回设置为some_new_element 键的值。这样的事情可能吗?怎么做?

【问题讨论】:

  • 当然可以使用某种包装器,但问题是为什么?地图的意义何在?如果只想要固定值,为什么不直接调用函数呢?
  • 你的函数带参数吗?

标签: c++ stl map std


【解决方案1】:

您可以包装地图本身或值类型或运算符[]。

最后一个包装器将是最简单的:

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 用于get_default 函数,我不太喜欢创建一个新类型只是为了强制一个特定的构造函数......
【解决方案2】:

std::string 的小包装类怎么样?

class StringWrapper {

    StringWrapper() { //... your code
    }

    operator std::string&() { return m_string; } // or something like that
private:
    std::string m_string;
};

现在您使用以下地图类型:

std::map<T1, StringWrapper> mymap;

在StringWrapper 的构造函数中,您可以定义自定义操作。当您将项目插入地图时,它会被调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 2013-03-14
    • 2019-08-24
    • 2014-10-15
    • 2016-11-03
    相关资源
    最近更新 更多