Предположим, мы хотим реализовать оптимизациюленивой нагрузки. Это связано с тем, что мы не хотим выполнять дорогостоящую инициализацию нашегоРесурсадо тех пор, пока он (если вообще) не будет действительно использован. Мы можем сделать это таким образом:
class Widget
{
mutable boost::optional<const Resource> resource_;
public:
Widget() {}
const Resource& getResource() const
{
if (resource_ == boost::none)
resource_.emplace("resource", "arguments");
return *resource_;
}
};
необязательныйпо умолчанию конструктор создает неинициализированный необязательный.РесурсКонструктор по умолчанию не предпринимается.Ресурсне обязательно должен бытьКонструкция по умолчанию. В функцииgetResourceмы сначала проверяем, инициализируется лиresource_. На этот раз мы используем не контекстное преобразование вbool, а сравнение сboost::no. Эти два способа эквивалентны. Функцияместоинициализирует необязательное место путем идеального переадресации аргументов конструкторуРесурс. Здесь не задействовано копирование или перемещение.Ресурсдаже не должен бытьMoveConstructible.
![[Note]](/img/note.png) |
Note |
Функцияemplaceдоступна только на компиляторах, поддерживающих ссылки на rvalue и вариативные шаблоны. Если ваш компилятор не поддерживает эти функции, и вам все равно нужно избегать каких-либо конструкций перемещения, используйтеIn-Place Factory. |