std::any::emplace
Материал из cppreference.com
<tbody>
</tbody>
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);
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' } /* нет аргументов */ );
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';
}
Возможный вывод:
Star::Star(string, int)
Star{ "Procyon" : 2943 };
St6vectorIcSaIcEE
C++17
Смотрите также
создаёт объект any (public функция-элемент) | |
| уничтожает содержащийся объект (public функция-элемент) |