促进 C++库

……其中一个世界。 赫伯·萨特安德烈亚历山德雷斯库,C++编码标准

这是旧版本Boost的文档。单击此处查看此页面的最新版本。
上一个向上主页下一步

第28章助力。变体

埃里克 弗里德曼

意大利 马曼

根据Boost软件许可证1.0版进行分发。(见随附文件许可证_1_0.txt或复制于http://www.boost.org/LICENSE_1_0.txt)

目录

介绍
摘要
动机
辅导的
基本用法
高级主题
参考
概念
标题<boost/variant.hpp>
标题<boost/variant/variant_fwd.hpp>
标题<boost/variant/variant.hpp>
标题<boost/variant/recursive_variant.hpp>
标题<boost/variant/recursive_wrapper.hpp>
标题<boost/variant/apply_visitor.hpp>
标题<boost/variant/get.hpp>
标题<boost/variant/bad_visit.hpp>
标题<boost/variant/sttatic_visiter.hpp>
标题<boost/variant/visitor_ptr.hpp>
设计概述
“永不清空”保证
杂记
促进。变型与增压。任何
便携性
故障排除
致谢
工具书类

介绍

摘要

这个变体类模板是一个安全的、通用的、基于堆栈的区分联合容器,为操作以统一的方式从一组异构类型中创建对象。鉴于标准容器,如标准::矢量可能被认为是"多值、单一类型,“变体是“多种类型,单一值."

的显著特征boost::变量包括:

动机

问题

很多时候,在C++程序的开发过程中程序员发现自己需要处理几个不同的以统一的方式键入。事实上,C++具有直接语言的特性通过其联盟关键词:

并集{int i;double d;}u;μd=3.14;u.i=3;//覆盖u.d(确定:u.d是POD类型)

C++语言联盟然而,构造几乎在面向对象的环境中没有用处。输入的构造该语言主要用于保持与C、 它只支持POD(普通旧数据)类型,因此不支持接受非普通结构的类型或销毁:

工会{整数i;标准::字符串s;//非法:std::string不是POD类型!}u;

显然需要另一种方法。典型解决方案以对象的动态分配为特征,随后通过公共基类(通常是虚拟基类)进行操作[亨氏01]或者,更危险的是空隙*). 的对象然后可以通过多态向下投射来检索具体类型构造(例如。,dynamic_cast(动态_广播),boost::any_cast等)。

然而,这类解决方案很容易出错以下各项:

  • 无法在检测到降级错误编译时间。因此,向下投射的用法不正确构造只会导致在运行时检测到错误。
  • 添加新的混凝土类型可能是忽略。如果将新的混凝土类型添加到层次结构,现有的向下转换代码将继续作为-is工作,完全忽略了新类型。因此,程序员必须在许多位置手动定位和修改代码,这些位置通常导致很难找到的运行时错误。

此外,即使正确实施这些解决方案由于使用堆、虚拟函数调用和多态向下转换。

解决方案:一个令人鼓舞的例子

这个boost::变量类模板以安全、直接和高效的方式解决这些问题。这个以下示例演示了如何使用该类:

#包括“boost/variant.hpp”#包括<iostream>类my_visitor:public提升::静态访问者<整数>{公众:int运算符()(int i)常量{返回i;}int运算符()(常量标准::字符串&str)常数{return str.length();}};整型main(){boost::变量<int,std::string>u(“hello world”);标准::cout<<u;//输出:hello worldint结果=boost::apply_visitor(my_visitor(),u);标准::cout<<结果;//输出:11(即“hello world”的长度)}

上一个向上主页下一步