Namespaces
Variants

std:: any

From cppreference.net
Utilities library
定义于头文件 <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 抛出的异常
(类)

注释

功能测试 标准 功能特性
__cpp_lib_any 201606L (C++17) std::any

示例

#include <any>
#include <iostream>
int main()
{
    std::cout << std::boolalpha;
    // 任意类型
    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 = 2;
    if (a.has_value())
        std::cout << a.type().name() << ": " << std::any_cast<int>(a) << '\n';
    // 重置
    a.reset();
    if (!a.has_value())
        std::cout << "无值\n";
    // 指向包含数据的指针
    a = 3;
    int* i = std::any_cast<int>(&a);
    std::cout << *i << '\n';
}

可能的输出:

int: 1
double: 3.14
bool: true
bad any_cast
int: 2
no value
3

参见

(C++11)
任何可复制构造的可调用对象的可复制包装器
(类模板)
仅支持移动的任意可调用对象包装器,可适配给定调用签名中的限定符
(类模板)
(C++17)
类型安全的可辨识联合体
(类模板)
(C++17)
可能包含或不包含对象的包装器
(类模板)
(C++11)
具有唯一对象所有权语义的智能指针
(类模板)
(C++26)
包含动态分配对象且具有类值语义的包装器
(类模板)
包含动态分配对象且具有类值语义的多态包装器
(类模板)