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

std::any::type

Материал из 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>
const std::type_info& type() const noexcept;
(начиная с C++17)

Запрашивает содержащийся тип.

Параметры

(нет)

Возвращаемое значение

typeid содержащегося значения, если экземпляр не пуст, иначе typeid(void).

Пример

Пример демонстрирует идиому посетителя std::any с возможностью регистрировать новых посетителей во время компиляции и во время выполнения.

#include <any>
#include <functional>
#include <iomanip>
#include <iostream>
#include <type_traits>
#include <typeindex>
#include <typeinfo>
#include <unordered_map>
#include <vector>
 
template<class T, class F>
inline std::pair<const std::type_index, std::function<void(std::any const&)>>
    to_any_visitor(F const &f)
{
    return {
        std::type_index(typeid(T)),
        [g = f](std::any const &a)
        {
            if constexpr (std::is_void_v<T>)
                g();
            else
                g(std::any_cast<T const&>(a));
        }
    };
}

static std::unordered_map<
    std::type_index, std::function<void(std::any const&)>>
    any_visitor {
        to_any_visitor<void>([]{ std::cout << "{}"; }),
        to_any_visitor<int>([](int x){ std::cout << x; }),
        to_any_visitor<unsigned>([](unsigned x){ std::cout << x; }),
        to_any_visitor<float>([](float x){ std::cout << x; }),
        to_any_visitor<double>([](double x){ std::cout << x; }),
        to_any_visitor<char const*>([](char const *s)
            { std::cout << std::quoted(s); }),
        // ... добавте больше обработчиков для ваших типов ...
    };

inline void process(const std::any& a)
{
    if (const auto it = any_visitor.find(std::type_index(a.type()));
        it != any_visitor.cend()) {
        it->second(a);
    } else {
        std::cout << "Незарегистрированный тип "<< std::quoted(a.type().name());
    }
}

template<class T, class F>
    inline void register_any_visitor(F const& f)
{
    std::cout << "Зарегистрировать посетителя для типа "
              << std::quoted(typeid(T).name()) << '\n';
    any_visitor.insert(to_any_visitor<T>(f));
}
 
int main()
{
    std::vector<std::any> va { {}, 42, 123u, 3.14159f, 2.71828, "C++17", };
 
    std::cout << "{ ";
    for (const std::any& a : va) {
        process(a);
        std::cout << ", ";
    }
    std::cout << "}\n";

    process(std::any(0xFULL)); //< Незарегистрированный тип "y" (unsigned long long)
    std::cout << '\n';

    register_any_visitor<unsigned long long>([](auto x) {
        std::cout << std::hex << std::showbase << x; 
    });

    process(std::any(0xFULL)); //< OK: 0xf
    std::cout << '\n';
}

Возможный вывод:

{ {}, 42, 123, 3.14159, 2.71828, "C++17", }
Незарегистрированный тип "y"
Зарегистрировать посетителя для типа "y"
0xf

Смотрите также

оболочка вокруг объекта type_info, которая может использоваться в качестве индекса в ассоциативных и неупорядоченных ассоциативных контейнерах
(класс) [править]