Предположим, мы хотим реализовать оптимизациюленивой нагрузки. Это связано с тем, что мы не хотим выполнять дорогостоящую инициализацию нашегоРесурса
до тех пор, пока он (если вообще) не будет действительно использован. Мы можем сделать это таким образом:
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. |