Namespaces
Variants

std::any::any

С сайта ru.cppreference.net
 
 
Библиотека утилит
Поддержка языка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования возможностей библиотеки (C++20)
Утилиты программ
Функции с переменным числом аргументов
Поддержка корутин (C++20)
Поддержка контрактов (C++26)
Трёхстороннее сравнение
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Общие утилиты
Операторы отношений (устарело в C++20)
Функции сравнения целых чисел
(C++20)(C++20)(C++20)    
(C++20)
Swap и операции с типами
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общеупотребительные типы-словари
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



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