Название: C++ lazy initialization Отправлено: ecspertiza от Ноябрь 28, 2017, 19:56 Собственно есть несколько вариантов решения, хочется сделать красиво :-)
Вариант 1, первое что нашел на эту тему, не радует то, что по сути это синглтон. Удалить никак Код: class TestClass Вариант 2, изобретал на коленке Код: template <class T> этот вариант устраивает, так как и инициализация отложенная, только при доступе. И при удалении Lazy объект внутри будет удален, уходим от синглтона. Но в этом случае не нравится что не понятно как передать параметры в конструктор объекта. Все усложняется еще сильнее когда мы не знаем количество параметров в конструкторе объекта. Есть мысли как использовать вариативный шаблон отложено в этом случае? Или может быть можно еще как то решить задачу? Название: Re: C++ lazy initialization Отправлено: Swa от Ноябрь 28, 2017, 22:39 Либо создавать объект на куче либо откладывать инициализацию не всего объекта, а только его больших полей.
Название: Re: C++ lazy initialization Отправлено: ksk- от Ноябрь 29, 2017, 05:28 Как вариант, можно сохранить параметры конструктора объекта в кортеж, а в методе GetObject() создавать объект из этого кортежа. Но и тут есть минусы. Например, если один и тот же класс имеет несколько конструкторов, то и типы Lazy для них будут различны.
Название: Re: C++ lazy initialization Отправлено: ksk- от Ноябрь 29, 2017, 05:32 Можно также вместо параметров передавать лямбду, которая будет создавать экземпляр объекта.
Название: Re: C++ lazy initialization Отправлено: ecspertiza от Ноябрь 29, 2017, 10:07 Либо создавать объект на куче либо откладывать инициализацию не всего объекта, а только его больших полей. Не очень понятно, чем инициализация на куче будет отличаться от шаред поинтера? Кроме того, что мы сами контролируем создание\удаление объекта Как вариант, можно сохранить параметры конструктора объекта в кортеж, а в методе GetObject() создавать объект из этого кортежа. Но и тут есть минусы. Например, если один и тот же класс имеет несколько конструкторов, то и типы Lazy для них будут различны. Была такая мысль, но хочется использовать шаблон Код: template<typename... Values> Может быть можно его сохранить в классе ? Название: Re: C++ lazy initialization Отправлено: ksk- от Ноябрь 29, 2017, 10:45 Псевдокод.
Код
Название: Re: C++ lazy initialization Отправлено: Old от Ноябрь 29, 2017, 11:08 У меня пока получилось так:
Код
К сожалению, сразу не получилось избавиться от перечисления всех типов параметров при описании указателя. :( Код
Название: Re: C++ lazy initialization Отправлено: __Heaven__ от Ноябрь 29, 2017, 14:21 В продолжение к посту Old
Код
Код
Название: Re: C++ lazy initialization Отправлено: __Heaven__ от Ноябрь 29, 2017, 14:27 К сожалению, сразу не получилось избавиться от перечисления всех типов параметров при описании указателя. :( Мне казалось, что c++17 научили распознавать параметры шаблонного класса... Но почему-то не сработало...Название: Re: C++ lazy initialization Отправлено: Old от Ноябрь 29, 2017, 17:05 Вариант с лямбдой выглядит аккуратней: :)
Код
Название: Re: C++ lazy initialization Отправлено: ViTech от Ноябрь 29, 2017, 17:31 Это всё хорошо, только где и как предлагается использовать классы/объекты типа Lazy? кроме как
... либо откладывать инициализацию не всего объекта, а только его больших полей. Название: Re: C++ lazy initialization Отправлено: ecspertiza от Ноябрь 29, 2017, 18:44 Код: template<class T> как то так получилось :-) Название: Re: C++ lazy initialization Отправлено: Old от Ноябрь 29, 2017, 18:51 Такая проверка избыточна:
Код
delete nullptr - разрешенная операция. :) Название: Re: C++ lazy initialization Отправлено: ssoft от Ноябрь 30, 2017, 09:38 Вариант с лямбдой выглядит аккуратней: :) В продолжение к посту Old Код
Код
Можно и еще усовершенствовать) Код
тогда по коду можно будет использовать код вида Код
и оператор = специальным способом реализовать. Хотелось бы узнать какая конкретно задача решается? Такая реализация Lazy имеет свои накладные расходы - копирует и запоминает параметры, необходимые для инициализации. Название: Re: C++ lazy initialization Отправлено: __Heaven__ от Ноябрь 30, 2017, 09:56 Код
Код
|