std::any::emplace(3)

NAME
std::any::emplace - std::any::emplace

Synopsis
   template< class ValueType, class... Args > (1) (since C++17)
   std::decay_t<ValueType>& emplace( Args&&... args );
   template< class ValueType, class U, class... Args >
   std::decay_t<ValueType>& emplace( std::initializer_list<U> il, (2) (since C++17)
   Args&&... args );
   Changes the contained object to one of type std::decay_t<ValueType> constructed from
   the arguments.
   First destroys the current contained object (if any) by reset(), then:
   1) constructs an object of type std::decay_t<ValueType>, direct-non-list-initialized
   from std::forward<Args>(args)..., as the contained object.
     * This overload participates in overload resolution only if
       std::is_constructible_v<std::decay_t<ValueType>, Args...> and
       std::is_copy_constructible_v<std::decay_t<ValueType>> are both true.
   2) constructs an object of type std::decay_t<ValueType>, direct-non-list-initialized
   from il, std::forward<Args>(args)..., as the contained object.
     * This overload participates in overload resolution only if
       std::is_constructible_v<std::decay_t<ValueType>, std::initializer_list<U>&,
       Args...> and std::is_copy_constructible_v<std::decay_t<ValueType>> are both
       true.

Template parameters
   ValueType - contained value type

Type requirements
   -
   std::decay_t<ValueType> must meet the requirements of CopyConstructible.

Return value
   A reference to the new contained object.

Exceptions
   Throws any exception thrown by T's constructor. If an exception is thrown, the
   previously contained object (if any) has been destroyed, and *this does not contain
   a value.

Example
// Run this code
 #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);
     const auto* 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' } /* no args */ );
     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';
 }

Possible output:
 Star::Star(string, int)
 Star{ "Procyon" : 2943 };
 St6vectorIcSaIcEE
 C++17

See also
   constructor constructs an any object
                 (public member function)
   reset destroys contained object
                 (public member function)