std::any::any
Материал из cppreference.com
<tbody>
</tbody>
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,5,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 для построения на месте
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: содержит набор 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 (public функция-элемент) |