如何使用std :: optional延迟初始化地图,并使用emplace将其添加到地图中

问题描述 投票:0回答:1

我有一个带有std :: optional映射的类,这里的理由是映射的构建成本很高,因此我正在寻找使影响最小化的方法。由于并不总是使用该地图,因此思考的是为什么要在使用之前构造它。

我在构造后向类添加值时遇到了麻烦,语法使我难以理解:),或者我可能误解了一些限制,因此实际上不能以这种方式使用它。一些见识将不胜感激。

class A {
public:
void addValues() {
_map_value.emplace(/* what goes here ?*/);
// It is expecting something like std::enable_if_t<std::is_constructible<std::map< .... initializer list
}
private:
std::optional<std::map<std::string, ResourceValue>> _map_value{};
};

我曾尝试制作一对和各种形式的Emplace。我看到我应该使用std :: optional :: emplace,但是我认为这只是为了构造,而不是为了以后访问和添加到地图。可选构建后,如何管理此地图?

c++ c++17 lazy-initialization
1个回答
1
投票

std::optional<T>::emplace接受多个参数,并使用这些参数调用T的构造函数以就地构造托管值。在这种情况下,它不需要任何参数,因为您不会将任何参数传递给map的构造函数。

可能事先检查了可选参数是否已经初始化,然后使用->访问托管对象:

if(!_map_value) {           // if the optional is empty
    _map_value.emplace();   // construct
    _map_value->insert(...); // Do stuff with the map
}
© www.soinside.com 2019 - 2024. All rights reserved.