boost总结之variant
2013-10-10 20:25
363 查看
boost的variant库类似于联合体,但是联合体中只能接受POD类型,但variant中并无此限制,它可以接受任意的类型.
[align=left]boost::variant <int, std::string , double> u;[/align]
[align=left]u = 4;[/align]
[align=left]int i = boost:: get<int >(u);[/align]
[align=left]std::cout << "int : " << i << std ::endl;[/align]
[align=left] [/align]
[align=left]u = "hello world!" ;[/align]
[align=left]std::string s = boost::get <std:: string>(u );[/align]
[align=left]std::cout << "string : " << s << std ::endl;[/align]
[align=left] [/align]
[align=left]u = 1.2;[/align]
[align=left]double d = boost:: get<double >(u);[/align]
[align=left]std::cout << "double : " << d << std ::endl;[/align]
[align=left] [/align]
[align=left]输出:[/align]
int : 4
string : hello world!
double : 1.2
[align=left] [/align]
[align=left]要获取variant中的值时,一定要知道当前类型,并由get操作进行获取相应的值,如果转型失败,会抛出bad_get异常,get操作时运行时检测,我们可以通过检测get返回值来进行判断转型是否成功如下:[/align]
[align=left] [/align]
[align=left]void printer (boost:: variant<int , std:: string, double >& u)[/align]
[align=left]{[/align]
[align=left] if (int *pi = boost::get <int>(& u))[/align]
[align=left] {[/align]
[align=left] std::cout << "int : " << * pi << std ::endl;[/align]
[align=left] }[/align]
[align=left] else if (std:: string *ps = boost:: get<std ::string>(& u))[/align]
[align=left] {[/align]
[align=left] std::cout << "string : " << * ps << std ::endl;[/align]
[align=left] }[/align]
[align=left] else if (double * pd = boost ::get< double>(&u ))[/align]
[align=left] {[/align]
[align=left] std::cout << "double : " << * pd << std ::endl;[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]通过printer函数中我们为get传进去的是variant的地址,返回如果是NULL的话则转型失败,进行下一个转型操作,依次来判断数据类型.可以看到通过get操作不仅需要知道需要转型的类型,而且还要在运行时判断转型是否成功,boost提供了编译时类型检测的安全访问方式,通过apply_visitor进行访问.[/align]
[align=left] [/align]
[align=left]class printer_visitor : public boost::static_visitor <void>[/align]
[align=left]{[/align]
[align=left]public:[/align]
[align=left] void operator ()(int i) const[/align]
[align=left] {[/align]
[align=left] std::cout << "int : " << i << std ::endl;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] void operator ()(std:: string& s ) const[/align]
[align=left] {[/align]
[align=left] std::cout << "string : " << s << std ::endl;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] void operator ()(double d) const[/align]
[align=left] {[/align]
[align=left] std::cout << "double : " << d << std ::endl;[/align]
[align=left] }[/align]
[align=left]};[/align]
[align=left]int main ()[/align]
[align=left]{[/align]
[align=left] boost::variant <int, std::string , double> u;[/align]
[align=left] printer_visitor visitor ;[/align]
[align=left] u = 4;[/align]
[align=left] boost::apply_visitor (visitor, u);[/align]
[align=left] u = "hello world!" ;[/align]
[align=left] boost::apply_visitor (visitor, u);[/align]
[align=left] u = 1.2;[/align]
[align=left] boost::apply_visitor (visitor, u);[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]我们定义一个variant时,如果我们没有给它赋任何值时,是不是他就是空呢?boost文档中"Never-Empty" Guarantee.也就是即使我们没有初始化,他也不会是空,默认的类型是我们模板参数的第一个,上例中默认的类型也就是int,值是0.[/align]
[align=left] [/align]
[align=left]我们还可以将variant作为容器的元素例如:[/align]
[align=left] [/align]
[align=left]std::vector <boost:: variant<int , std:: string, double > > v;[/align]
[align=left]v.push_back (4);[/align]
[align=left]v.push_back ("hello world!");[/align]
[align=left]v.push_back (1.2);[/align]
[align=left]std::for_each (v. begin(), v .end(), boost::apply_visitor (printer_visitor()));[/align]
[align=left]boost::variant <int, std::string , double> u;[/align]
[align=left]u = 4;[/align]
[align=left]int i = boost:: get<int >(u);[/align]
[align=left]std::cout << "int : " << i << std ::endl;[/align]
[align=left] [/align]
[align=left]u = "hello world!" ;[/align]
[align=left]std::string s = boost::get <std:: string>(u );[/align]
[align=left]std::cout << "string : " << s << std ::endl;[/align]
[align=left] [/align]
[align=left]u = 1.2;[/align]
[align=left]double d = boost:: get<double >(u);[/align]
[align=left]std::cout << "double : " << d << std ::endl;[/align]
[align=left] [/align]
[align=left]输出:[/align]
int : 4
string : hello world!
double : 1.2
[align=left] [/align]
[align=left]要获取variant中的值时,一定要知道当前类型,并由get操作进行获取相应的值,如果转型失败,会抛出bad_get异常,get操作时运行时检测,我们可以通过检测get返回值来进行判断转型是否成功如下:[/align]
[align=left] [/align]
[align=left]void printer (boost:: variant<int , std:: string, double >& u)[/align]
[align=left]{[/align]
[align=left] if (int *pi = boost::get <int>(& u))[/align]
[align=left] {[/align]
[align=left] std::cout << "int : " << * pi << std ::endl;[/align]
[align=left] }[/align]
[align=left] else if (std:: string *ps = boost:: get<std ::string>(& u))[/align]
[align=left] {[/align]
[align=left] std::cout << "string : " << * ps << std ::endl;[/align]
[align=left] }[/align]
[align=left] else if (double * pd = boost ::get< double>(&u ))[/align]
[align=left] {[/align]
[align=left] std::cout << "double : " << * pd << std ::endl;[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]通过printer函数中我们为get传进去的是variant的地址,返回如果是NULL的话则转型失败,进行下一个转型操作,依次来判断数据类型.可以看到通过get操作不仅需要知道需要转型的类型,而且还要在运行时判断转型是否成功,boost提供了编译时类型检测的安全访问方式,通过apply_visitor进行访问.[/align]
[align=left] [/align]
[align=left]class printer_visitor : public boost::static_visitor <void>[/align]
[align=left]{[/align]
[align=left]public:[/align]
[align=left] void operator ()(int i) const[/align]
[align=left] {[/align]
[align=left] std::cout << "int : " << i << std ::endl;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] void operator ()(std:: string& s ) const[/align]
[align=left] {[/align]
[align=left] std::cout << "string : " << s << std ::endl;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] void operator ()(double d) const[/align]
[align=left] {[/align]
[align=left] std::cout << "double : " << d << std ::endl;[/align]
[align=left] }[/align]
[align=left]};[/align]
[align=left]int main ()[/align]
[align=left]{[/align]
[align=left] boost::variant <int, std::string , double> u;[/align]
[align=left] printer_visitor visitor ;[/align]
[align=left] u = 4;[/align]
[align=left] boost::apply_visitor (visitor, u);[/align]
[align=left] u = "hello world!" ;[/align]
[align=left] boost::apply_visitor (visitor, u);[/align]
[align=left] u = 1.2;[/align]
[align=left] boost::apply_visitor (visitor, u);[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]我们定义一个variant时,如果我们没有给它赋任何值时,是不是他就是空呢?boost文档中"Never-Empty" Guarantee.也就是即使我们没有初始化,他也不会是空,默认的类型是我们模板参数的第一个,上例中默认的类型也就是int,值是0.[/align]
[align=left] [/align]
[align=left]我们还可以将variant作为容器的元素例如:[/align]
[align=left] [/align]
[align=left]std::vector <boost:: variant<int , std:: string, double > > v;[/align]
[align=left]v.push_back (4);[/align]
[align=left]v.push_back ("hello world!");[/align]
[align=left]v.push_back (1.2);[/align]
[align=left]std::for_each (v. begin(), v .end(), boost::apply_visitor (printer_visitor()));[/align]
相关文章推荐
- python之列表使用方法总结
- 挑战庞果英雄会之子序列的个数
- 1014(2)string的用法
- 结构体定义里的冒号
- cstring转char*
- (贪心5.2.3)POJ 1065 Wooden Sticks(利用数据有序化来进行贪心选择)
- JavaScript 数组详解
- hdu1867 A + B for you again (KMP)
- Codeforces-346A
- hdu 1021-Fibonacci Again
- 记录,很好的用例子解释了什么是mapreduce
- 卦卦学mysql系列(1)——mysql入门 对数据库的操作
- nginx交替出现404和200
- c++中map的用法详解
- oracle 修改用户下部分表现有表空间
- 阿里的一道附加题(直接凌乱了)
- SQL Server 中大小写区分的处理
- ARM从基础到大师--序
- CUDA, 用于大量数据的超级运算:第十一节
- JavaScript时间格式