c++oding="utf-8" ?>
std::any可存储任意可复制类型(如int、std::string、自定义类、std::vector),但不能存引用、数组、void、抽象类或不可复制类型(如std::unique_ptr),否则触发编译错误或std::bad_any_cast异常。

std::any 能存什么类型?哪些会崩溃
std::any 可以持有任意可复制(CopyConstructible)类型的值,包括 int、std::string、自定义类(只要满足复制要求),甚至 std::vector<double></double>。但它**不能存引用、数组、void、抽象类对象、或不可复制的类型(如 std::unique_ptr)**——试图构造会触发编译错误或运行时 std::bad_any_cast。
常见踩坑点:
- 误写
std::any a = &x;→ 编译失败(引用不被允许) - 用
std::any_cast<t>(a)</t>去取一个非引用存储的值 → 运行时抛std::bad_any_cast - 对空
std::any(默认构造或调用reset()后)直接std::any_cast→ 同样抛异常
怎么安全地取出值?避免 std::bad_any_cast
核心原则:取值前必须确认类型匹配。不能依赖“我存的时候知道是什么”。推荐两种方式:
- 用
std::any_cast<t>(&a)</t>返回T*:成功返回非空指针,失败返回nullptr,适合条件判断 - 用
a.type() == typeid(T)先比类型,再 cast —— 注意typeid对 cv 修饰敏感,const int和int类型不同
示例:
std::any a = 42;
if (auto p = std::any_cast<int>(&a)) {
std::cout <h3>实现一个 type-erased vector:std::vector<:any> 够用吗?</:any>
</h3>
<p>直接用 <code>std::vector<:any></:any></code> 是最简方案,但要注意它只是“容器”,不是“类型擦除容器接口”。如果你需要统一访问(比如统一调用 <code>.print()</code> 或 <code>.size()</code>),它做不到 —— 因为 <code>std::any</code> 不提供泛型接口。</p>
<p>真正实用的“类型擦除容器”往往需要配合函数对象或虚函数层。但若只求存储+按需取值,<code>std::vector<:any></:any></code> 完全可行:</p>
<ul>
<li>支持随机访问、动态扩容,性能开销仅来自 <code>std::any</code> 内部的小对象优化(SOO)边界判断</li>
<li>注意:频繁 <code>std::any_cast</code> 且类型不确定时,建议用 <code>std::type_info</code> 缓存或 <code>std::unordered_map</code> 分类索引,避免重复类型检查</li>
<li>别把 <code>std::any</code> 当 <code>void*</code> 用:它不负责生命周期管理,析构由其内部值自动完成</li>
</ul>
<h3>和 void* / union / boost::any 比有什么实际差异?</h3>
<p><code>std::any</code> 是类型安全的运行时擦除,相比裸 <code>void*</code>:它自带类型信息、自动析构、禁止非法访问;相比 <code>union</code>:不限制类型数量、无需手动管理构造/析构;相比 <code>boost::any</code>:API 几乎一致,但 <code>std::any</code> 在 C++17+ 标准库中更轻量(无额外依赖)。</p>
<p>真实限制:</p>
<ul>
<li>没有 <code>std::any</code> 的移动语义优化:移动后原对象进入空状态,但某些实现(如 libstdc++)可能仍保留小对象缓冲区,不保证零开销</li>
<li>无法像 <code>std::variant</code> 那样做编译期类型约束,所有类型检查都在运行时</li>
<li>调试困难:GDB/LLDB 对 <code>std::any</code> 内容支持有限,通常只能看到 <code>type()</code>,看不到值本身</li>
</ul>
<p>复杂点在于:你得自己设计取值逻辑的分发机制,而不是指望 <code>std::any</code> 提供多态行为。它擦除的是类型,不是接口。</p></int>C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











