Как да въведем поддръжката на агрегатна инициализация за правилното им изграждане в (напр.) STL контейнери? Имам предвид нещо като:
struct A { int i; char c; };
std::list< A > l; // empty
l.insert(std::memberwise, 1, '2');
// <=> l.insert({1, '2'});
std::memberwise
е възможен таг, като вече съществуващ в STL std::piecewise_construct
, std::allocator_arg
и т.н.
Възможно ли е теоретично да се разширят STL контейнери по такъв начин? Има ли най-добрият начин (STL-way) да направите това? Как може да изглежда?
Въпросът е за дизайн на интерфейс и за възможност за (вътрешно) внедряване (не подробности).
Сигурен съм, че контейнерите използват нещо като ::new (static_cast< void * >(pstorage) value_type(std::forward< Args >(args)...);
вътрешно. Сигурен съм, че замяната на скоби със скоби би била неуспешна. Поради нестесняване, напр.
ДОПЪЛНИТЕЛНО
Като цяло l.insert({1, '2'});
, споменато в коментарите, може да доведе до прекомерно преместване на value_type
. Много вероятно тази стъпка ще бъде оптимизирана от всеки съвременен компилатор, но така или иначе има прекалено много къдрави скоби.
l.insert({1, '2'});
работи в C++11. - person Chad   schedule 29.12.2016l.emplace{,_back}(1, '2');
- не. - person Tomilov Anatoliy   schedule 29.12.2016emplace
илиemplace_back
чрез агрегатна инициализация, той всъщност създава обект и след това го копира в структурата. - person RyanP   schedule 29.12.2016std::is_aggregate
за откриване на агрегати, за да ги обвие в обвивката на агрегати. - person Tomilov Anatoliy   schedule 29.12.2016