c语言sscanf函数的用法是什么
309
2022-12-02
C++核心准则边译边学-X.3 使用variant代替union
union(联合体)和struct相似,也可以包含多个数据成员,但是不同的是同时只允许一个成员有效,因此经常作为作为节约空间的类使用。考虑下面的代码:
union Uv { int i; double df; }; Uv u1; u1.i = 100; std::cout << "u1.i=" << u1.i << std::endl; std::cout << "u1.df=" << u1.df << std::endl; u1.df = 122.0; std::cout << "u1.i=" << u1.i << std::endl; std::cout << "u1.df=" << u1.df << std::endl;
u1.i=100 u1.df=-9.25596e+61 u1.i=0 u1.df=122
u1.i=100u1.df=-9.25596e+61u1.i=0u1.df=122
从结果可以看到,为i赋值之后,i的值有效,而df无效;为df赋值之后,df值有效,而i无效。这件事本身符合union的定义,但问题是如果只是面对一个联合体的对象,用户没有办法知道那个成员的值是有效的。如果成员是指针或者对象,那么带来的类型风险会更大。一般的做法是自己实现一个类,另外设置一个管理类型的数据成员,问题是可以解决,但是代价也不小。
这个问题可以使用C++17中引入的variant来解决。直接看代码:
std::variant
代码首先构建了一个包含int和double成员的variant变量,它的名称为var,初值为double类型的122.0。这里variant会根据初始值的内容自动决定需要初始化那个成员。
初值设定完成之后,可以使用variant提供的index方法获取当前有效的成员索引。接下来故意在double有效的情况下获取int成员的值,观察会发生什么。结果如下:
1122bad variant access
可以看到获取double值的处理正常完成,而获取int值的处理抛出了异常。我们也可以尝试相反的情况:
var = 100; std::cout << var.index() << std::endl; try { std::cout << std::get
结果如下:
0100bad variant access
这次是获取int成员成功,获取double成员时抛出异常。
从这段说明不难看出,有了variant之后,一切都变得简单又安全。
觉得文章有帮助,欢迎点赞并分享给更多的朋友。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~