std::any是C++17引入的类型安全容器,可存储任意可复制类型,需通过std::any_cast安全提取值,并支持运行时类型检查,适用于灵活类型场景但存在性能开销。

在C++17中,std::any 被引入到标准库中,它允许你持有任意类型的单一值。这在需要类型擦除但又不想使用void指针或继承时非常有用。相比 void*,std::any 是类型安全的,能自动管理对象的生命周期。
要使用 std::any,需要包含头文件 <any>。你可以用它保存 int、string、自定义类等任何可复制的类型。
示例:
  #include <any>
  #include <iostream>
  #include <string>
  std::any value = 42;                    // 存储 int
  value = std::string{"Hello"};           // 替换为 string
  value = 3.14;                           // 再替换为 double
从 std::any 中取出值必须使用 std::any_cast,否则会引发异常或返回空指针(取决于用法)。
立即学习“C++免费学习笔记(深入)”;
有两种常用方式:
示例:
  try {
  int n = std::any_cast
  std::cout << "Value is int: " << n << "\n";
  } catch (const std::bad_any_cast&) {
  std::cout << "Value is not an int\n";
  }
  // 安全检查方式
  if (auto str = std::any_cast<:string>(&value)) {
  std::cout << "Got string: " << *str << "\n";
  }
可以使用 .type() 方法获取当前 any 对象所存值的类型信息,返回 const std::type_info&,常用于调试或运行时判断。
示例:
  if (value.type() == typeid(int)) {
  std::cout << "Currently holds an int\n";
  } else if (value.type() == typeid(std::string)) {
  std::cout << "Currently holds a string\n";
  }
虽然 std::any 很灵活,但也有一些需要注意的地方:
清空 any 的方法:
  value.reset();  // 清空内容,变为无类型状态
  if (!value.has_value()) {
  std::cout << "No value stored\n";
  }
基本上就这些。std::any 提供了一种轻量级的类型擦除机制,适用于配置、参数传递、插件系统等需要灵活类型的场合,但别滥用,保持类型明确仍是C++的最佳实践。
以上就是c++++怎么使用std::any来持有任意类型的值_c++ std::any使用方法的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
 
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号