std::any

来自cppreference.com
< cpp‎ | utility
 
 
工具库
语言支持
类型支持(基本类型、RTTI)
库功能特性测试宏 (C++20)
动态内存管理
程序工具
协程支持 (C++20)
变参数函数
调试支持
(C++26)
三路比较
(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)
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 所抛出的异常
(类)

注解

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

示例

#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 = 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
没有值
3

参阅

(C++11)
任意可复制构造的可调用对象的可复制包装
(类模板)
任意可调用对象的仅移动包装,支持给定调用签名中的限定符
(类模板)
(C++17)
类型安全的可辨识联合体
(类模板)
(C++17)
可能或可能不保有一个对象的包装器
(类模板)