Namespaces
Variants

std::any:: any

From cppreference.net
Utilities library
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 ) .
5) Создает объект с начальным содержимым - объектом типа std:: decay_t < ValueType > , прямое-не-списочное-инициализированное из std:: forward < Args > ( args ) ... .
6) Создает объект с начальным содержимым - объектом типа std:: decay_t < ValueType > , прямое-не-списочное-инициализированное из il, std:: forward < Args > ( args ) ... .

Содержание

Параметры шаблона

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
(публичная функция-член)