Как лениво инициализировать карту, используя std ::, и добавить к ней, используя emplace - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть класс со стандартной картой std ::, причина в том, что карта дорогая, поэтому я ищу способы минимизировать влияние. Так как карта не всегда используется, нужно подумать, зачем ее создавать, пока она НЕ используется.

У меня проблемы с добавлением значений в класс после построения, синтаксис ускользает от меня :), или, возможно, я неправильно понял некоторые ограничения, и это не может быть использовано таким образом. Хотелось бы получить некоторое понимание.

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 :: option :: emplace, но я думаю, что это только для конструкции, а не для доступа и добавления к карте впоследствии. Как я могу управлять этой картой после ее создания?

1 Ответ

1 голос
/ 30 апреля 2020

std::optional<T>::emplace принимает ряд аргументов и вызывает конструктор T с этими аргументами для создания управляемого значения на месте. В этом случае он не принимает никаких параметров, потому что вы не передадите никаких параметров конструктору карты.

Может быть, предварительно проверьте, инициализирован ли необязательный объект или нет, и затем получите доступ к управляемому объекту с помощью ->:

if(!_map_value) {           // if the optional is empty
    _map_value.emplace();   // construct
    _map_value->insert(...); // Do stuff with the map
}
...