如何使用variant代替union

技术如何使用variant代替union如何使用variant代替union,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。union(联合体

对于很多新手来说,如何使用变体而不是联合并不是很清楚。为了帮助大家解决这个问题,下面小编就详细讲解一下。需要的人可以从中学习,希望你能有所收获。

Union (union)类似于struct,也可以包含多个数据成员,但不同的是,一次只允许一个成员有效,所以它经常被用作节省空间的类。考虑以下代码:

unionUv { intidoubledf};Uvu1u1.i=100STD : cout ' u1 . I=' u1 . istd 3360: endl;STD : cout ' u1 . df=' u1 . dfstd : endl;u1.df=122.0STD : cout ' u1 . I=' u1 . istd 3360: endl;STD : cout ' u1 . df=' u1 . dfstd : endl;

上面的代码首先声明一个有两个成员的联合,然后分别为这两个成员赋值。为了知道赋值后每个成员的状态,赋值后分别输出两个成员的值,结果如下:

u1.i=100

u1.df=-9.25596e 61

u1.i=0

u1.df=122

u 1 . I=100 u1 . df=-9.25596 e 61 u1 . I=0u 1 . df=122

从结果可以看出,给I赋值后,I的值有效,但df无效;给df赋值后,df的值有效,I无效。这件事本身符合合纵的定义,但问题是如果只面对一个联合体的对象,用户是没有办法知道那个成员的值是有效的。如果成员是指针或对象,类型风险会更大。一般的做法是自己实现一个类,设置一个管理类型的数据成员。问题可以解决,但成本不小。

这个问题可以通过使用C 17中引入的变体来解决。直接看代码:

std:variantint,double var { 122.0 };STD : cout var . index()STD : endl;尝试{ inti=STD : getint(var);} catch(const STD : bad _ variant _ accesse){ STD : coute . what()STD : endl;}

首先,代码构造了一个包含int和double成员的variant变量,其名称为var,初始值为double类型的122.0。这里variant会根据初始值的内容自动决定需要初始化哪个成员。

初始值设置完成后,可以使用variant提供的index方法获取当前有效成员索引。接下来,当double有效时,故意获取int成员的值,并观察会发生什么。结果如下:

1122badvariantaccess

可以看到,获取double值的过程正常完成,而获取int值的过程抛出异常。我们也可以尝试相反的情况:

var=100STD : cout var . index()STD : endl;请尝试{ STD : couttd : getint(var)STD : endl;STD : couttd : get double(var)STD : endl;} catch(const STD : bad _ variant _ accesse){ STD : coute . what()STD : endl;}

结果如下:

0100badvariantaccess

这一次,成功获取了int成员,并且在获取double成员时引发了异常。

从这个解释不难看出,有了变体,一切都变得简单而安全。

阅读以上内容对你有帮助吗?如果您想了解更多相关知识或阅读更多相关文章,请关注行业资讯频道,感谢您的支持。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/79846.html

(0)

相关推荐

  • 最新单机游戏排行榜,十大耐玩手机单机游戏有哪些

    技术最新单机游戏排行榜,十大耐玩手机单机游戏有哪些我觉得比较好玩的十个手机单机游戏有最新单机游戏排行榜:《地狱边境》、《刺客信条》、《狂爆之翼》、《阿尔托的冒险》、《滑雪大冒险》、《方舟》、《使命召唤(手游版)》、《我的

    生活 2021年10月26日
  • oauth2.0概念怎么理解

    技术oauth2.0概念怎么理解oauth2.0概念怎么理解,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。OAuth 2.0 是目前最流行的授权机制,用

    攻略 2021年10月19日
  • 歌吟的意思,古代文人雅士的啸是什么意思

    技术歌吟的意思,古代文人雅士的啸是什么意思啸,一种歌吟方式歌吟的意思。啸,一种歌吟方式,称之为“啸”。啸不承担切实的内容,不遵守既定的格式,只随心所欲地吐露出一派风致,一腔心曲,因此特别适合乱世名士。历史上的魏晋时期多有

    生活 2021年10月27日
  • 如何理解ansible自动化运维数据库

    技术如何理解ansible自动化运维数据库这期内容当中小编将会给大家带来有关如何理解ansible自动化运维数据库,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 通过ansible

    攻略 2021年11月12日
  • 我为妈妈做件事作文,帮妈妈擦地作文50个字

    技术我为妈妈做件事作文,帮妈妈擦地作文50个字范文我为妈妈做件事作文:5月9日是母亲节,老师布置了“帮妈妈做一件事”的作业。我不知道该帮妈妈做什么事,就去问爸爸,爸爸说:“可以帮妈妈洗洗碗,或者帮妈妈捶捶背。”我又去问妈

    生活 2021年10月23日
  • 如何理解Java设计模式的装饰模式

    技术如何理解Java设计模式的装饰模式这篇文章主要介绍“如何理解Java设计模式的装饰模式”,在日常操作中,相信很多人在如何理解Java设计模式的装饰模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望

    攻略 2021年11月8日