std::any::any
С сайта ru.cppreference.net
constexpr any() noexcept;
|
(1) | (начиная с C++17) |
any( const any& other );
|
(2) | (начиная с C++17) |
any( any&& other ) noexcept;
|
(3) | (начиная с C++17) |
template< class ValueType >
any( ValueType&& value );
|
(4) | (начиная с C++17) |
template< class ValueType, class... Args >
explicit any( std::in_place_type_t<ValueType>, Args&&... args );
|
(5) | (начиная с C++17) |
template< class ValueType, class U, class... Args >
explicit any( std::in_place_type_t<ValueType>, std::initializer_list<U> il,
Args&&... args );
|
(6) | (начиная с C++17) |
Создаёт новый объект any.
1) Создаёт пустой объект.
2,3) Копирует (2) или перемещает (3) содержимое
other в новый экземпляр, так что любое содержимое эквивалентно по типу и значению содержимому other до вызова конструктора, или пусто, если other пусто. Формально,2) Если
other пусто, создаваемый объект пуст. В противном случае, эквивалентно any(std::in_place_type<T>, std::any_cast<const T&>(other)), где T — это тип объекта, содержащегося в other.3) Если
other пусто, создаваемый объект пуст. В противном случае, создаваемый объект содержит либо объект, содержащийся в other, либо объект того же типа, созданный из объекта, содержащегося в other, рассматривая этот объект как rvalue.4) Создаёт объект с начальным содержимым — объектом типа
std::decay_t<ValueType>, прямо инициализированным из std::forward<ValueType>(value).
- Эта перегрузка участвует в разрешении перегрузки только если
std::decay_t<ValueType>не является тем же типом, чтоanyи не специализацией std::in_place_type_t, аstd::is_copy_constructible_v<std::decay_t<ValueType>>являетсяtrue.
5) Создаёт объект с начальным содержимым — объектом типа
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.
6) Создаёт объект с начальным содержимым — объектом типа
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
.
|
||
Параметры
| other | - |
другой
any
объект для копирования или перемещения
|
| value | - | значение для инициализации содержащегося значения |
| il, args | - | аргументы для передачи конструктору содержащегося объекта |
Исключения
2,4-6)
Выбрасывает любое исключение, выброшенное конструктором содержащегося типа.
Примечания
Поскольку конструктор по умолчанию является
constexpr
, статические объекты
std::any
инициализируются в рамках
статической нелокальной инициализации
до начала любой динамической нелокальной инициализации. Это позволяет безопасно использовать объекты типа
std::any
в конструкторе любого статического объекта.
Пример
Запустить этот код
#include <boost/core/demangle.hpp> #include <any> #include <initializer_list> #include <iostream> #include <memory> #include <set> #include <string> #include <utility> struct A { int age; std::string name; double salary; #if __cpp_aggregate_paren_init < 201902L // Требуется до C++20 для in-place конструирования A(int age, std::string name, double salary) : age(age), name(std::move(name)), salary(salary) {} #endif }; // Использование abi demangle для вывода читаемого имени типа экземпляра any void printType(const std::any& a) { std::cout << boost::core::demangle(a.type().name()) << '\n'; } int main() { // Конструктор #4: std::any содержит int std::any a1{7}; // Конструктор #5: std::any содержит A, сконструированный на месте std::any a2(std::in_place_type<A>, 30, "Ada", 1000.25); // Конструктор #6: std::any содержит set из A с пользовательским компаратором auto lambda = [](auto&& l, auto&& r){ return l.age < r.age; }; std::any a3( std::in_place_type<std::set<A, decltype(lambda)>>, { A{39, std::string{"Ada"}, 100.25}, A{20, std::string{"Bob"}, 75.5} }, lambda); printType(a1); printType(a2); printType(a3); }
Возможный вывод:
int
A
std::set<A, main::{lambda(auto:1&&, auto:2&&)#1}, std::allocator<A> >
Смотрите также
присваивает объект
any
(публичная функция-член) |