Namespaces
Variants

std::any

来自 zh.cppreference.net
 
 
 
 
定义于头文件 <any>
class any;
(C++17 起)

类 any 描述了一个适用于任何满足可复制构造类型的单值类型安全容器。

1)类 any 的对象保存满足构造函数要求的任何类型的实例,或者为空;这被称为类 对象的状态。所保存的实例称为包含的对象。如果两个状态均为空,或者均非空且包含的对象等价,则这两个状态等价。any2)
非成员 函数提供对包含对象的类型安全访问。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)
包含动态分配对象且具有类值语义的包装器
(类模板)
包含动态分配对象且具有类值语义的多态包装器
(类模板)