boost program_options

一直認爲boost都是hpp直接調用就能夠了,最近遇到兩個例子都不是這樣的一個是boost的thread,另一個就是這個了,boost在編譯好以後會有庫文件的,注意不是在當前的libs下面,而是stage/libs下面,咱們在使用這個模塊的時候要加上相應的動態或者靜態的庫。html

 

當咱們寫一些小程序的時候不免要寫一些輸入參數,固然用linux自帶的也能夠linux

[cpp]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. int next_option;  
  2. /* Parse options. */  
  3. do {  
  4.     next_option = getopt_long (argc, argv, short_options, long_options, NULL);  
  5. }while(next_options);  

 

可是咱們要寫不少error handing,user manual 之類的, 比較麻煩,並且打印出來的格式也不是很好看。小程序

那boost的program_options能夠幫助咱們解決這個問題。ui

 

 

 

boost program_options不只支持配置command line,並且支持配置像INI同樣的配置文件,這個模塊很是好,下面是對配置文件格式的說明:spa

語法大體有三條,一個是name value的對應關係,另外一個是section的模塊,最後一個是註釋的規範。.net

 

Configuration file parser

 

The parse_config_file function implements parsing of simple INI-like configuration files. Configuration file syntax is line based:unix

  • A line in the form:code

    = namevalue

    gives a value to an option.orm

  • A line in the form:htm

    []
            section name

    introduces a new section in the configuration file.

  • The # character introduces a comment that spans until the end of the line.

The option names are relative to the section names, so the following configuration file part:

[gui.accessibility]
visual_bell=yes
      

is equivalent to

gui.accessibility.visual_bell=yes
      

 

如何實現一對多的支持?

若是隻是command line裏面的很簡單 只要加一個token就能夠,可是若是是配置文件的則validate

實現很簡單:

po::value<vector<float> >(&(paralist))->multitoken()

注意利用第三個參數重載

namespace boost{
void validate(boost::any& v,
          const vector<string>& values,
            vector<float>*, int) {
    cout << "hello" << endl;
        vector<double> dvalues;
          for(vector<string>::const_iterator it = values.begin();
                      it != values.end();
                          ++it) {
                  //stringstream ss(*it);
                  cout<<*it<<endl;
                            }
}
}

如何支持負數?

負數和program option會有衝突,通常經過加引號來處理,或者經過去除短option,只支持長option

 

char* v[] = {"name","--IDlist=0","1","200","-2"}; int c = 5; std::vector<int> IDlist; namespace po = boost::program_options; po::options_description commands("Allowed options"); commands.add_options() ("IDlist",po::value< std::vector<int> >(&IDlist)->multitoken(), "Which IDs to trace: ex. --IDlist=0 1 200 -2") ("help","print help") ; po::variables_map vm; po::store(parse_command_line(c, v, commands, po::command_line_style::unix_style ^ po::command_line_style::allow_short), vm); po::notify(vm); BOOST_FOREACH(int id, IDlist) std::cout << id << std::endl;

 

 



下面講一下具體的使用體會

1 打印很方便尤爲是help manual, 對各類命令的錯誤的提示很好

2 type 和 name直接關聯,根據名字直接讀到變量中

3 支持command和文本配置文件,不一樣的源之間能夠合併使用

4 沒有辦法指定變量的有效範圍。

 

總之,用了以後很有點專業軟件的風範。

http://www.boost.org/doc/libs/1_45_0/doc/html/program_options.html

http://stackoverflow.com/questions/2935587/handle-complex-options-with-boosts-program-options/2939249#2939249

相關文章
相關標籤/搜索