支持类型安全地存储和获取任意类型的值

  1. #include <list>
  2. #include <boost/any.hpp>
  3. #include <string>
  4. #include <iostream>
  5.  
  6. typedef std::list<boost::any> many;
  7.  
  8. void append_int(many & values, int value)
  9. {
  10. boost::any to_append = value;
  11. values.push_back(to_append);
  12. }
  13.  
  14. void append_string(many & values, const std::string & value)
  15. {
  16. values.push_back(value);
  17. }
  18.  
  19. void append_char_ptr(many & values, const char * value)
  20. {
  21. values.push_back(value);
  22. }
  23.  
  24. void append_any(many & values, const boost::any & value)
  25. {
  26. values.push_back(value);
  27. }
  28.  
  29. void append_nothing(many & values)
  30. {
  31. values.push_back(boost::any());
  32. }
  33.  
  34. bool is_empty(const boost::any & operand)
  35. {
  36. return operand.empty();
  37. }
  38.  
  39. bool is_int(const boost::any & operand)
  40. {
  41. return operand.type() == typeid(int);
  42. }
  43.  
  44. bool is_char_ptr(const boost::any & operand)
  45. {
  46. try
  47. {
  48. boost::any_cast<const char *>(operand);
  49. return true;
  50. }
  51. catch(const boost::bad_any_cast &)
  52. {
  53. return false;
  54. }
  55. }
  56.  
  57. bool is_string(const boost::any & operand)
  58. {
  59. return boost::any_cast<std::string>(&operand);
  60. }
  61.  
  62. void count_all(many & values, std::ostream & out)
  63. {
  64. out << "#empty == "
  65. << std::count_if(values.begin(), values.end(), is_empty) << std::endl;
  66. out << "#int == "
  67. << std::count_if(values.begin(), values.end(), is_int) << std::endl;
  68. out << "#const char * == "
  69. << std::count_if(values.begin(), values.end(), is_char_ptr) << std::endl;
  70. out << "#string == "
  71. << std::count_if(values.begin(), values.end(), is_string) << std::endl;
  72. }
  73.  
  74. int main()
  75. {
  76. many values;
  77.  
  78. append_int(values, );
  79. append_any(values, );
  80. append_char_ptr(values, "abc");
  81. append_string(values, std::string("abc"));
  82. append_int(values, );
  83. std::string str = "def";
  84. append_string(values, str);
  85. append_any(values, str);
  86. append_nothing(values);
  87.  
  88. count_all(values, std::cout);
  89. return ;
  90. }

Boost.Any的更多相关文章

  1. boost强分类器的实现

    boost.cpp文件下: bool CvCascadeBoost::train( const CvFeatureEvaluator* _featureEvaluator, int _numSampl ...

  2. Boost信号/槽signals2

    信号槽是Qt框架中一个重要的部分,主要用来解耦一组互相协作的类,使用起来非常方便.项目中有同事引入了第三方的信号槽机制,其实Boost本身就有信号/槽,而且Boost的模块相对来说更稳定. signa ...

  3. 玩转Windows服务系列——使用Boost.Application快速构建Windows服务

    玩转Windows服务系列——创建Windows服务一文中,介绍了如何快速使用VS构建一个Windows服务.Debug.Release版本的注册和卸载,及其原理和服务运行.停止流程浅析分别介绍了Wi ...

  4. boost::function的用法

    本片文章主要介绍boost::function的用法. boost::function 就是一个函数的包装器(function wrapper),用来定义函数对象. 1.  介绍 Boost.Func ...

  5. Boost条件变量condition_variable_any

    Boost条件变量可以用来实现线程同步,它必须与互斥量配合使用.使用条件变量实现生产者消费者的简单例子如下,需要注意的是cond_put.wait(lock)是在等待条件满足.如果条件不满足,则释放锁 ...

  6. 新手,Visual Studio 2015 配置Boost库,如何编译和选择,遇到无法打开文件“libboost_thread-vc140-mt-gd-1_63.lib“的解决办法

    1,到官网下载最新的boost,www.boost.org 这里我下载的1-63版本. 2,安装,解压后运行bootstrap.bat文件.稍等一小会就OK. 3,编译boost库.注意一定要使用VS ...

  7. boost.python笔记

    boost.python笔记 标签: boost.python,python, C++ 简介 Boost.python是什么? 它是boost库的一部分,随boost一起安装,用来实现C++和Pyth ...

  8. vs2013给项目统一配置boost库

    1.打开项目,然后点击菜单中的 视图->其他窗口->属性管理器 2. 打开属性管理器,点击项目前的箭头,展开项目,找到debug或者release下面的Microsoft.Cpp.Win3 ...

  9. 基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

    本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...

  10. Boost.Python简介

    Boost.Python简单概括:是Boost库的一部分:用来在C++代码中调用python代码以及在Python代码中调用C++代码,并且避免用户直接操作指针. 以下内容搬运自:https://wi ...

随机推荐

  1. Linux下的crontab定时执行任务命令详解

    在LINUX中,周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep cron].cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间.cron的配置文件称为“cr ...

  2. Codeforces 707 E. Garlands (二维树状数组)

    题目链接:http://codeforces.com/problemset/problem/707/E 给你nxm的网格,有k条链,每条链上有len个节点,每个节点有一个值. 有q个操作,操作ask问 ...

  3. 关于 ServiceStack.Redis 4.0 License

    今天更新了框架中的Redis驱动ServiceStack.Redis,最新版本4.0.5.0. 在做简单压力测试时出现异常,提示每小时允许6000个请求. The free-quota limit o ...

  4. 【转】获取手机的ipv4地址

    http://blog.csdn.net/yueqinglkong/article/details/17391051 直接贴代码: public class GetLocalIpAddress ext ...

  5. CANBus Determining Network Baud Rate, Automatic bit-rate detection

    http://www.canbushack.com/blog/index.php?title=determining-network-baud-rate Determining Network Bau ...

  6. Slony-I中对storelisten出错的处理

    客户质询的现象是: Slony-I运行中,log中发现FATAL信息: FATAL storeListen: unknown node ID 出现了上述错误后,再看后继的log,又恢复正常运行了. 客 ...

  7. hdu 5265 pog loves szh II STL

    pog loves szh II Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...

  8. Linux内核--usb子系统的分析

    drivers/usb/core/usb.c subsys_init(usb_init); module_exit(usb_exit); 我们 看到一个subsys_initcall,它也是一个宏,我 ...

  9. 一步步学Mybatis-实现单表情况下的CRUD操作 (3)

    今天这一章要紧接上一讲中的东西,本章中创建基于单表操作的CRUD与GetList操作,此示例中以Visitor表为范例,为了创建一点测试数据我们先弄个Add方法吧 继续在上次的IVisitorOper ...

  10. 使用Underscore.js的template将Backbone.js的js代码和html代码分离

    这段时间在学习Require.js和Backbone.js的过程中,发现有些项目里的HTML代码都是写在View的js代码里面的,渲染的时候需要对Collection进行循环,再将HTML代码拼接上去 ...