std::any::emplace
De cppreference.com
template<class ValueType, class... Args> std::decay_t<ValueType>& emplace( Args&&... args); | (1) | (desde C++17) |
template<class ValueType, class U, class... Args> std::decay_t<ValueType>& emplace(std::initializer_list<U> il, Args&&... args); | (2) | (desde C++17) |
Cambia el objeto contenido a uno de tipo std::decay_t<ValueType>, construído a partir de los argumentos.
Primero destruye el objeto contenido actual (si es que lo hay) mediante reset(), luego:
1) Construye un objeto de tipo std::decay_t<ValueType>, usando la inicialización directa de no lista a partir de std::forward<Args>(args)..., como el objeto contenido.
- Esta sobrecarga solo participa en la resolución de sobrecargas si tanto std::is_constructible_v<std::decay_t<ValueType>, Args...> como std::is_copy_constructible_v<std::decay_t<ValueType>> son true.
2) Construye un objeto de tipo std::decay_t<ValueType>, usando la inicialización directa de no lista a partir de il, std::forward<Args>(args)..., como el objeto contenido.
- Esta sobrecarga solo participa en la resolución de sobrecargas si tanto std::is_constructible_v<std::decay_t<ValueType>, std::initializer_list<U>&, Args...> como std::is_copy_constructible_v<std::decay_t<ValueType>> son true.
Contenido |
[editar]Parámetros de plantilla
ValueType | - | Tipo del valor contenido. |
Requisitos de tipo | ||
-std::decay_t<ValueType> debe satisfacer los requisitos de CopyConstructible. |
[editar]Valor de retorno
Una referencia al nuevo objeto contenido.
[editar]Excepciones
Lanza cualquier excepción lanzada por el constructor de T
. Si se lanza una excepción, el objeto previamente contenido (si es que lo hay) se destruye, y *this
no contiene un valor.
[editar]Ejemplo
Ejecuta este código
#include <algorithm>#include <any>#include <iostream>#include <string>#include <vector> class Estrella {std::string nombre;int id; public: Estrella(std::string nombre, int id): nombre { nombre }, id { id }{std::cout<<"Estrella::Estrella(string, int)\n";} void imprimir()const{std::cout<<"Estrella{ \""<< nombre <<"\" : "<< id <<" };\n";}}; auto main()->int{std::any celestial;// (1) emplace( Args&&... args ); celestial.emplace<Estrella>("Procyon", 2943);constauto* estrella =std::any_cast<Estrella>(&celestial); estrella->imprimir(); std::any av;// (2) emplace( std::initializer_list<U> il, Args&&... args ); av.emplace<std::vector<char>>({'C', '+', '+', '1', '7'}/* no argumentos */);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';}
Posible salida:
Estrella::Estrella(string, int) Estrella{ "Procyon" : 2943 }; St6vectorIcSaIcEE C++17
[editar]Véase también
Construye un objeto any . (función miembro pública) | |
Destruye el objeto contenido. (función miembro pública) |