Chinaunix首页 | 论坛 | 博客
  • 博客访问: 163648
  • 博文数量: 18
  • 博客积分: 299
  • 博客等级: 二等列兵
  • 技术积分: 731
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-19 00:39
文章分类

全部博文(18)

文章存档

2013年(7)

2012年(11)

分类: C/C++

2013-05-18 00:58:22

日前项目当中用到boost::program_options这个库,主要是用来parse commandline的,大致的功能如下:

以下代码摘自boost help

点击(此处)折叠或打开

  1. // Declare the supported options.
  2. po::options_description desc("Allowed options");
  3. desc.add_options()
  4.     ("help", "produce help message")
  5.     ("compression", po::value<int>(), "set compression level")
  6. ;

  7. po::variables_map vm;
  8. po::store(po::parse_command_line(ac, av, desc), vm);
  9. po::notify(vm);

  10. if (vm.count("help")) {
  11.     cout << desc << "n";
  12.     return 1;
  13. }

  14. if (vm.count("compression")) {
  15.     cout << "Compression level was set to "
  16.  << vm["compression"].as<int>() << ".n";
  17. } else {
  18.     cout << "Compression level was not set.n";
  19. }

利用这个库,可以生成类似下列的help信息:


点击(此处)折叠或打开

  1. $ bin/gcc/debug/first --help
  2. Allowed options:
  3.   --help : produce help message
  4.   --compression arg : set compression level

这边的设置功能很有意思,一条条直接插入,很简洁,如下:


点击(此处)折叠或打开

  1. desc.add_options()
  2.     ("help", "produce help message")
  3.     ("compression", po::value<int>(), "set compression level")
  4. ;
如何实现这样的功能的?其实在看了boost的源代码之后,就可以知道这个是利用重载()运算符实现的,下面,我简化了boost库的代码,写了一个测试的程序,如下。


点击(此处)折叠或打开

  1. #include <boost/shared_ptr.hpp>

  2. #include <iostream>
  3. #include <string>
  4. #include <vector>
  5. using namespace std;

  6. namespace program_option_own
  7. {
  8.     class program_option_data
  9.     {
  10.     private:
  11.         string _name;
  12.         string _description;
  13.     public:
  14.         program_option_data( const char* name, const char * description):
  15.             _name(name), _description(description)
  16.         {
  17.         };
  18.         string& name(){return _name;};
  19.         string& description(){return _description;};
  20.     };

  21.     class program_option_init
  22.     {
  23.     private:
  24.         string _optname;
  25.         std::vector < boost::shared_ptr<program_option_data> > m_options;
  26.     public:
  27.         program_option_init(const char* name):_optname(name){};
  28.         program_option_init& add_option(){return *this;};
  29.         program_option_init& add(boost::shared_ptr<program_option_data> desc){
  30.             m_options.push_back(desc);
  31.             return *this;
  32.         };
  33.         program_option_init& operator()(const char * name,
  34.                                          const char * description){
  35.             boost::shared_ptr<program_option_data> d(
  36.                 new program_option_data(name, description));
  37.             add(d);
  38.             return *this;
  39.         };
  40.         friend ostream & operator << (ostream&, program_option_init &);
  41.     };
  42.      ostream & operator << (ostream & o, program_option_init & p)
  43.     {
  44.         o << p._optname << endl;
  45.         for (int i = 0; i < p.m_options.size(); i++)
  46.             o << p.m_options[i]->name() << " " << p.m_options[i]->description() << endl;
  47.     }
  48. }
  49. int main( int argc, char ** argv )
  50. {
  51.     using namespace program_option_own;
  52.     program_option_init set("title");
  53.     set.add_option()
  54.         ("--help", "show help")
  55.         ("--c", "configuration")
  56.         ;
  57.     cout << set;

  58.     return 0;
  59. }
简化版当中,定义了2个类,program_option_data用来存储单个插入信息的string,program_option_init用来存储所有的program_option_data,并将它们保存在一个vector里面,用适当的方法打印出来。
下列是打印出来的值


点击(此处)折叠或打开

  1. [root@jsu27 program_option_own]# ./program_option_own.bin
  2. title
  3. --help show help
  4. --c configuration

该方法设置简单明了,值得我们学习。
阅读(8712) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

CU博客助理2013-06-09 15:29:41

嘉宾点评:勇于对开源库boost进行改进,是一种值得鼓励的行为,可以提高自己的技术水平。但是如果写出做了哪些改进,改进的效果是什么?并且做出进一步思考,为什么boost库要这么写?是否有什么特殊的考虑呢?也许简化了的代码,不能覆盖所有的情况,或者引入了某些缺陷。(感谢您参与“原创博文评选”获奖结果即将公布)