如何利用std::any实现存储任意类型数据的类?
- 内容介绍
- 文章标签
- 相关推荐
本文共计975个文字,预计阅读时间需要4分钟。
使用 `std::any` 存储东西非常简单,例如:
常见错误是写成 int x = a;(编译失败)或 int x = std::any_cast<int>(a);</int> 却没检查 a 里到底是不是 int(运行时崩溃)。
- 取值前务必用
a.type() == typeid(int)判断,或捕获std::bad_any_cast -
std::any_cast<t>(a)</t>返回引用,std::any_cast<t>(a)</t>返回副本——后者可能触发拷贝构造,注意开销 - 空的
std::any(默认构造)调用std::any_cast也会抛异常,别忘了a.has_value()
std::any 和 std::variant 哪个该用?
std::any 是“运行时完全未知类型”,std::variant 是“编译期枚举出所有可能类型”。前者灵活但无类型安全,后者安全但需提前列全。
本文共计975个文字,预计阅读时间需要4分钟。
使用 `std::any` 存储东西非常简单,例如:
常见错误是写成 int x = a;(编译失败)或 int x = std::any_cast<int>(a);</int> 却没检查 a 里到底是不是 int(运行时崩溃)。
- 取值前务必用
a.type() == typeid(int)判断,或捕获std::bad_any_cast -
std::any_cast<t>(a)</t>返回引用,std::any_cast<t>(a)</t>返回副本——后者可能触发拷贝构造,注意开销 - 空的
std::any(默认构造)调用std::any_cast也会抛异常,别忘了a.has_value()
std::any 和 std::variant 哪个该用?
std::any 是“运行时完全未知类型”,std::variant 是“编译期枚举出所有可能类型”。前者灵活但无类型安全,后者安全但需提前列全。

