很多时候,在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”的长度)}