std::any::emplace
Материал из cppreference.com
template<class ValueType, class... Args> std::decay_t<ValueType>& emplace( Args&&... args); | (1) | (начиная с C++17) |
template<class ValueType, class U, class... Args> std::decay_t<ValueType>& emplace(std::initializer_list<U> il, Args&&... args); | (2) | (начиная с C++17) |
Изменяет содержащийся объект на один из типов std::decay_t<ValueType>, созданный из аргументов.
Сначала уничтожает текущий содержащийся объект (если есть) с помощью reset(), затем:
1) создаёт объект типа std::decay_t<ValueType>, прямой инициализацией не списком из std::forward<Args>(args)... в качестве содержащегося объекта.
- Эта перегрузка участвует в разрешении перегрузки, только если std::is_constructible_v<std::decay_t<ValueType>, Args...> и std::is_copy_constructible_v<std::decay_t<ValueType>> оба являются true.
2) создаёт объект типа std::decay_t<ValueType>, прямой инициализацией не списком из il, std::forward<Args>(args)... в качестве содержащегося объекта.
- Эта перегрузка участвует в разрешении перегрузки, только если std::is_constructible_v<std::decay_t<ValueType>, std::initializer_list<U>&, Args...> и std::is_copy_constructible_v<std::decay_t<ValueType>> оба являются true.
Содержание |
[править]Параметры шаблона
ValueType | — | тип содержащегося значения |
Требования к типам | ||
-std::decay_t<ValueType> должен соответствовать требованиям CopyConstructible. |
[править]Возвращаемое значение
Ссылка на новый содержащийся объект.
[править]Исключения
Выдаёт любое исключение, созданное конструктором T
. Если возникает исключение, ранее содержащийся объект (если он был) уничтожен, а *this не содержит значения.
[править]Пример
Запустить этот код
#include <algorithm>#include <any>#include <iostream>#include <string>#include <vector> class Star {std::string name;int id; public: Star(std::string name, int id): name { name }, id { id }{std::cout<<"Star::Star(string, int)\n";} void print()const{std::cout<<"Star{ \""<< name <<"\" : "<< id <<" };\n";}}; auto main()->int{std::any celestial;// (1) emplace( Args&&... args ); celestial.emplace<Star>("Procyon", 2943);constauto* star =std::any_cast<Star>(&celestial); star->print(); std::any av;// (2) emplace( std::initializer_list<U> il, Args&&... args ); av.emplace<std::vector<char>>({'C', '+', '+', '1', '7'}/* нет аргументов */);std::cout<< av.type().name()<<'\n';constauto* va =std::any_cast<std::vector<char>>(&av);std::for_each(va->cbegin(), va->cend(), [](charconst& c){std::cout<< c;});std::cout<<'\n';}
Возможный вывод:
Star::Star(string, int) Star{ "Procyon" : 2943 }; St6vectorIcSaIcEE C++17
[править] Смотрите также
создаёт объект any (public функция-элемент) | |
уничтожает содержащийся объект (public функция-элемент) |