如何利用std::any实现存储任意类型数据的类?

2026-04-30 13:081阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计975个文字,预计阅读时间需要4分钟。

如何利用std::any实现存储任意类型数据的类?

使用 `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 是“编译期枚举出所有可能类型”。前者灵活但无类型安全,后者安全但需提前列全。

阅读全文
标签:C

本文共计975个文字,预计阅读时间需要4分钟。

如何利用std::any实现存储任意类型数据的类?

使用 `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 是“编译期枚举出所有可能类型”。前者灵活但无类型安全,后者安全但需提前列全。

阅读全文
标签:C