std::any

来自cppreference.com
< cpp‎ | utility
 
 
工具库
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (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)
any
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
初等字符串转换
(C++17)
(C++17)
 
 
在标头 <any> 定义
class any;
(C++17 起)

any 描述用于任何可拷贝构造类型的单个值的类型安全容器。

1)any 的对象存储任何满足构造函数要求的类型的一个实例或为空,而这被称为 any 类对象的状态。存储的实例被称作所含对象。若两个状态均为空,或均为非空且其所含对象等价,则两个状态等价。
2) 非成员 any_cast 函数提供对所含对象的类型安全访问。

鼓励实现避免小对象的动态分配,但这种优化仅可以应用于 std::is_nothrow_move_constructible 对其返回 true 的类型。

成员函数

构造 any 对象
(公开成员函数)
赋值 any 对象
(公开成员函数)
销毁 any 对象
(公开成员函数)
修改器
更改所含对象,直接构造新对象
(公开成员函数)
销毁所含对象
(公开成员函数)
交换二个 any 对象
(公开成员函数)
观察器
检查对象是否含有值
(公开成员函数)
返回所含值的 typeid
(公开成员函数)

非成员函数

特化 std::swap 算法
(函数)
(C++17)
对被容纳对象的类型安全访问
(函数模板)
(C++17)
创建 any 对象
(函数模板)

辅助类

当类型不匹配时按值返回形式的 any_cast 所抛出的异常
(类)

示例

#include <any>
#include <iostream>
 
int main()
{
    std::cout << std::boolalpha;
 
    // any 类型
    std::any a = 1;
    std::cout << a.type().name() << ": " << std::any_cast<int>(a) << '\n';
    a = 3.14;
    std::cout << a.type().name() << ": " << std::any_cast<double>(a) << '\n';
    a = true;
    std::cout << a.type().name() << ": " << std::any_cast<bool>(a) << '\n';
 
    // 有误的转型
    try
    {
        a = 1;
        std::cout << std::any_cast<float>(a) << '\n';
    }
    catch (const std::bad_any_cast& e)
    {
        std::cout << e.what() << '\n';
    }
 
    // 拥有值
    a = 1;
    if (a.has_value())
    {
        std::cout << a.type().name() << '\n';
    }
 
    // 重置
    a.reset();
    if (!a.has_value())
    {
        std::cout << "no value\n";
    }
 
    // 指向所含数据的指针
    a = 1;
    int* i = std::any_cast<int>(&a);
    std::cout << *i << "\n";
}

可能的输出:

i: 1
d: 3.14
b: true
bad any_cast
i
no value
1

参阅

(C++11)
包装具有指定函数调用签名的任意可复制构造类型的可调用对象
(类模板)
(C++17)
类型安全的可辨识联合体
(类模板)