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...>comostd::is_copy_constructible_v<std::decay_t<ValueType>>sontrue.
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...>comostd::is_copy_constructible_v<std::decay_t<ValueType>>sontrue.
Parámetros de plantilla
| ValueType | - | Tipo del valor contenido. |
| Requisitos de tipo | ||
-std::decay_t<ValueType> debe satisfacer los requisitos de CopyConstructible.
| ||
Valor de retorno
Una referencia al nuevo objeto contenido.
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.
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);
const auto* 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';
const auto* va = std::any_cast<std::vector<char>>(&av);
std::for_each(va->cbegin(), va->cend(), [](char const& c) { std::cout << c; });
std::cout << '\n';
}
Posible salida:
Estrella::Estrella(string, int)
Estrella{ "Procyon" : 2943 };
St6vectorIcSaIcEE
C++17
Véase también
Construye un objeto any. (función miembro pública) | |
| Destruye el objeto contenido. (función miembro pública) |