C++ 参考手册

位置:首页 > C++ 参考手册 >工具库 > std::any

定义于头文件 <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