说明:std::any只在支持C++17或以上标准的编译器下才有,C++17标准之前的编译器不支持。

定义在any头文件中:#include <any>
是一个可用于任何类型单个值的类型安全的容器.

使用方法

#include <any>
#include <iostream>int main() {// 存储任意类型的单个值// 成员函数type():返回容器中的值的类型// 非成员函数std::any_cast<T>():强制类型转换std::any a = 1;std::cout << a.type().name() << ": " << std::any_cast<int>(a) << '\n';// i: 1a = 3.14;std::cout << a.type().name() << ": " << std::any_cast<double>(a) << '\n';// d: 3.14// bad_any_casttry {a = 1;std::cout << std::any_cast<float>(a) << '\n'; // 此处不加异常捕获会崩溃}catch (const std::bad_any_cast& a) {std::cout << a.what() << '\n';// bad any_cast}// has_value: 是否有值any h = 1;if (h.has_value()) {std::cout << h.type().name() << std::endl;// i}// reset:清空容器h.reset();if (h.has_value()) {std::cout << "no value\n";// no value}std::cout << h.type().name() << '\n';try {std::cout << std::any_cast<int>(h) << '\n'; // 此处不加异常捕获会崩溃}catch (std::bad_any_cast&a){std::cout << "fefe\n";}// pointer to contained datah = 1;int* i = std::any_cast<int>(&h);// 这里有点奇怪std::cout << *i << '\n';// 1system("pause()");return 0;
}

说明:

  • 对不同类型值的进行std::any_cast强转会导致崩溃,如16行代码所示
  • 对值执行reset后,其type().name()变为void
  • 对值执行reset后,再执行对应类型的std::any_cast会崩溃,如36行代码所示
  • 对指针进行std::any_cast操作,对应的类型转换是其对应的类型而不是类型的指针,如45行代码中是
    int* i = std::any_cast<int>(&h);

    而不是:

int* i = std::any_cast<int*>(&h);/

上例输出如下:

总结:

std::any a = 1;: 声明一个any类型的容器,容器中的值为int类型的1
a.type(): 得到容器中的值的类型
std::any_cast<int>(a);: 强制类型转换, 转换失败可以捕获到std::bad_any_cast类型的异常
has_value(): 判断容器中是否有值
reset(): 删除容器中的值
std::any_cast<int>(&a): 强制转换得到容器中的值的地址

本文参考了:https://blog.csdn.net/u012086173/article/details/86421202

std::any用法示例相关推荐

  1. Go基础系列:双层channel用法示例

    Go channel系列: channel入门 为select设置超时时间 nil channel用法示例 双层channel用法示例 指定goroutine的执行顺序 双层通道的解释见Go的双层通道 ...

  2. objdump反汇编用法示例

    objdump反汇编用法示例 原文:http://blog.csdn.net/zoomdy/article/details/50563680 -d:将代码段反汇编 -S:将代码段反汇编的同时,将反汇编 ...

  3. python 装饰器 参数-python函数装饰器之带参数的函数和带参数的装饰器用法示例...

    本文实例讲述了python函数装饰器之带参数的函数和带参数的装饰器用法.分享给大家供大家参考,具体如下: 1. 函数带多个参数 # 普通的装饰器, 打印函数的运行时间 def decrator(fun ...

  4. php指定长度 分割整形,php指定长度分割字符串str_split函数用法示例

    本文实例讲述了php指定长度分割字符串str_split函数用法.分享给大家供大家参考,具体如下: 示例1:$str = 'abcdefgh'; $arr = str_split($str,2); 运 ...

  5. Linux find 用法示例

    Linux中find常见用法示例 ·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \; find命令的参数 ...

  6. mysql教程or怎么用_MySQL中or语句用法示例

    1.mysql中or语法的使用,在mysql语法中or使用注意点. 项目遇到坑,遍历发放奖励数据查询错误!!! $sql = 'SELECT * FROM `vvt_spread_doubleegg_ ...

  7. html兄弟选择器怎么用,CSS的相邻兄弟选择器用法示例讲解

    对于有相同父元素的相邻HTML元素查找便可以使用CSS的相邻兄弟选择器,这里我们就来看一下CSS的相邻兄弟选择器用法简单讲解: 可选择紧接在另一个元素后的元素,且二者有相同的父级元素 下面代码中,it ...

  8. boost::hana::ext::std::vector_tag用法的测试程序

    boost::hana::ext::std::vector_tag用法的测试程序 实现功能 C++实现代码 实现功能 boost::hana::ext::std::vector_tag用法的测试程序 ...

  9. boost::format模块format的基本用法示例

    boost::format模块format的基本用法示例 实现功能 C++实现代码 实现功能 boost::format模块format的基本用法示例 C++实现代码 #include "b ...

最新文章

  1. url编码混乱下下载工具如何应对
  2. Html5必看:教你如何选择移动APP开发框架
  3. Linux CentOS 7下 Apache Tomcat 7 安装与配置
  4. 调用未绑定的父类方法和使用supper 函数 之间的选择.
  5. 为什么安装了cmpp没法拖到工具栏_软件SU:简介、安装以及设置
  6. java 中的 什么意思啊_JAVA 中的 - 是什么意思?
  7. 嵌入式电路设计(自己的第一个pcb电路)
  8. 【scala初学】scala IDE eclipse
  9. 单片机c语言视频教程bd,单片机C语言教程五
  10. 免费中文Python电子书
  11. Windows下安装libiconv库教程(转换字符编码库)
  12. 以现在的眼光来看,Windows 95是怎样的操作系统?
  13. 快速入门github网站,了解GitHub网站的基本使用
  14. 魔兽最多人的服务器,魔兽世界9.0人口最多的服务器_魔兽世界
  15. 解决:The ‘Access-Control-Allow-Origin‘ header contains___Nginx跨域设置
  16. 数组去重:将一数组中重复的元素去掉剩余部分保存到新数组中
  17. linux的几个小工具(日历和计算器)
  18. 洛克菲勒写给儿子的38封信(中)、天下没免费的午餐、越是成熟的稻子,越垂下稻穗、财富是勤奋的副产品、只为成功找方法,不为失败找借口、成功的希望就在自己手中、第二名与最有一名没有什么两样
  19. 前端学习笔记-html-列表标签
  20. java的poi的office和wps的样式不显示问题

热门文章

  1. 昆仑通泰暖通空调中央空调控制组态程序本人完全自行开发,适用于绝大多数西门子方案暖通空调自控系统
  2. nmn是科学还是智商税,nmn最新消息
  3. DODO被黑详解:偷天换日
  4. 计算机二级和nit 哪个难,国家二级计算机考试和NIT有什么不同,那种比较好?...
  5. #Python3控制QQ窗口
  6. jieba词频统计、关键词提取、词云图制作
  7. Android之Window和弹窗问题
  8. 有关optimizer.param_groups用法的示例分析
  9. 基于策略路由部署的网络多出口设计研究与实现
  10. 再观《离开雷锋的日子》