Scroll to navigation

std::any::emplace(3) C++ Standard Libary 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)

2022.07.31 http://cppreference.com