C++怎么使用STL中的any类型

来源:个人站长作者:美园和花头衔:网络博主
导读:本期聚焦于小伙伴创作的《C++怎么使用STL中的any类型》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C++怎么使用STL中的any类型》有用,将其分享出去将是对创作者最好的鼓励。

C++17引入的std::any是STL中提供的一种类型擦除容器,它可以存储任意满足可拷贝构造条件的类型的值,无需在定义时指定具体存储的类型,极大提升了代码的灵活性。它的设计目标是解决传统union只能存储固定预定义类型、扩展性差的问题,同时比void*更安全,自带类型检查能力。

C++怎么使用STL中的any类型

any类型的基本使用

要使用std::any,首先需要包含对应的头文件<any>。我们可以通过多种方式构造std::any对象,也可以直接赋值任意类型的值。

#include <any>
#include <iostream>
#include <string>

int main() {
    // 默认构造,此时any不存储任何值
    std::any a1;
    std::cout << "a1是否有值: " << a1.has_value() << std::endl; // 输出0

    // 直接赋值构造
    std::any a2 = 10;
    std::any a3 = std::string("hello");

    // 使用make_any构造
    std::any a4 = std::make_any<double>(3.14);

    return 0;
}

any类型的常用接口

std::any提供了一系列接口来操作存储的值,下面是常用接口的说明:

接口名称功能说明
has_value()判断any对象是否存储了有效值,返回bool类型
type()返回存储值的类型信息,类型为const std::type_info&
reset()清空any对象中存储的值,使其回到无值状态
swap(other)交换两个any对象存储的内容

获取any中存储的值

要从std::any中获取存储的值,需要使用std::any_cast函数。如果转换的类型和存储的实际类型不匹配,会抛出std::bad_any_cast异常,因此使用时建议做好异常处理。

#include <any>
#include <iostream>
#include <string>

int main() {
    std::any a = 100;

    try {
        // 正确转换,获取int值
        int val = std::any_cast<int>(a);
        std::cout << "获取到的值: " << val << std::endl;

        // 错误转换,类型不匹配,会抛出异常
        std::string wrong_val = std::any_cast<std::string>(a);
    } catch (const std::bad_any_cast& e) {
        std::cout << "类型转换失败: " << e.what() << std::endl;
    }

    // 也可以使用指针形式的any_cast,转换失败返回nullptr,不抛异常
    int* ptr = std::any_cast<int>(&a);
    if (ptr != nullptr) {
        std::cout << "指针方式获取值成功: " << *ptr << std::endl;
    }

    return 0;
}

any类型的注意事项

  • std::any只能存储可拷贝构造的类型,如果存储的类型不可拷贝,会在编译期报错。
  • 频繁对std::any进行赋值和类型转换会有一定的性能开销,因为涉及堆内存分配和类型检查,不适合对性能要求极高的场景。
  • 不要存储临时对象的引用,std::any存储的是值的拷贝,修改原对象不会影响any中存储的内容。

实际使用场景示例

比如我们需要实现一个通用的配置项存储结构,配置项的值可能是整数、字符串、布尔值等不同类型,这时候就可以用std::any来存储。

#include <any>
#include <iostream>
#include <string>
#include <unordered_map>

int main() {
    // 用unordered_map存储配置项,key是配置名,value是配置值
    std::unordered_map<std::string, std::any> config;
    config["max_conn"] = 100;
    config["server_ip"] = std::string("192.168.0.1");
    config["enable_log"] = true;

    // 读取配置项
    if (config["max_conn"].has_value()) {
        int max_conn = std::any_cast<int>(config["max_conn"]);
        std::cout << "最大连接数: " << max_conn << std::endl;
    }

    return 0;
}

C++anySTLtype_erasure修改时间:2026-06-28 01:03:18

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。