【问题标题】:Boost program options - get all entries in section提升程序选项 - 获取部分中的所有条目
【发布时间】:2012-06-19 10:11:32
【问题描述】:

根据文档,我可以解析样式中的配置文件:

 [main section]
 string = hello world. 
 [foo]
 message = Hi !

但我需要解析插件列表:

 [plugins]
 somePlugin. 
 HelloWorldPlugin
 AnotherPlugin
 [settings]
 type = hello world

如何获取插件部分中的字符串向量?

【问题讨论】:

    标签: c++ boost-program-options


    【解决方案1】:

    对于 boost 程序选项配置文件,如果该行没有声明一个部分,例如 [settings],那么它需要采用 name=value 格式。对于您的示例,将其编写如下:

    [插件]
    名称 = somePlugin
    名称 = HelloWorldPlugin
    名称 = 另一个插件
    [设置]
    类型=你好世界

    插件列表现在将对应于“plugins.name”选项,它需要是一个多令牌选项。

    下面是一个从 settings.ini 文件中读取上述设置的示例程序:

    #include <boost/program_options.hpp>
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
    
    int main()
    {
      namespace po = boost::program_options;
    
      typedef std::vector< std::string > plugin_names_t;
      plugin_names_t plugin_names;
      std::string settings_type;
    
      // Setup options.
      po::options_description desc("Options");
      desc.add_options()
        ("plugins.name", po::value< plugin_names_t >( &plugin_names )->multitoken(),
                         "plugin names" )
        ("settings.type", po::value< std::string >( &settings_type ),
                          "settings_type" );
    
      // Load setting file.
      po::variables_map vm;
      std::ifstream settings_file( "settings.ini" , std::ifstream::in );
      po::store( po::parse_config_file( settings_file , desc ), vm );
      settings_file.close();
      po::notify( vm );    
    
      // Print settings.
      typedef std::vector< std::string >::iterator iterator;
      for ( plugin_names_t::iterator iterator = plugin_names.begin(),
                                          end = plugin_names.end();
            iterator < end;
            ++iterator )
      {
        std::cout << "plugin.name: " << *iterator << std::endl;
      }
      std::cout << "settings.type: " << settings_type << std::endl;
    
      return 0;
    }
    

    产生以下输出:

    plugin.name: somePlugin
    插件名称:HelloWorldPlugin
    plugin.name: 另一个插件
    settings.type: 你好世界

    【讨论】:

    • 谢谢,所以没有办法在插件名称前加上“name=”吗?
    • 不用自己写客户解析器,不行。
    猜你喜欢
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    相关资源
    最近更新 更多