Пространства имён
Варианты
Действия

std::any::any

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
 
<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 функция-элемент) [править]