如何使用 std::optional 延迟初始化地图,并使用 emplace 添加到地图
How to lazy initialize a map using std::optional, and add to it using emplace
我有一个 class 和 std::optional 地图,这里的原因是地图的构建成本很高,所以我正在寻找将影响降到最低的方法。由于地图并不总是被使用,所以思考为什么要构建它直到它被使用。
我在构造后向 class 添加值时遇到了问题,语法使我难以理解 :),或者我可能误解了一些限制,它实际上不能以这种方式使用。一些见解将不胜感激。
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{};
};
我试过制作成对的和各种形式的位置。我看到我应该使用 std::optional::emplace,但我认为这只是为了构建,而不是为了之后访问和添加到地图。选择性构建后如何管理此地图?
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
}
我有一个 class 和 std::optional 地图,这里的原因是地图的构建成本很高,所以我正在寻找将影响降到最低的方法。由于地图并不总是被使用,所以思考为什么要构建它直到它被使用。
我在构造后向 class 添加值时遇到了问题,语法使我难以理解 :),或者我可能误解了一些限制,它实际上不能以这种方式使用。一些见解将不胜感激。
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{};
};
我试过制作成对的和各种形式的位置。我看到我应该使用 std::optional::emplace,但我认为这只是为了构建,而不是为了之后访问和添加到地图。选择性构建后如何管理此地图?
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
}