Опции программы Boost - получить все записи в разделе

Согласно документации я могу разобрать файлы конфигурации в стиле:

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

Но мне нужно разобрать список плагинов:

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

Как я могу получить вектор строк, которые находятся в разделе плагинов?


person user1307957    schedule 16.06.2012    source источник


Ответы (1)


Для файлов конфигурации параметров программы повышения, если строка не объявляет раздел, например [settings], тогда она должна быть в формате name=value. Для вашего примера напишите это следующим образом:

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

Список плагинов теперь будет соответствовать опции «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
plugin.name: HelloWorldPlugin
plugin.name: AnotherPlugin
settings.type: hello world
person Tanner Sansbury    schedule 16.06.2012
comment
Спасибо, так что нет способа сделать это без необходимости иметь имя = перед именем плагина? - person user1307957; 17.06.2012
comment
Без написания собственного клиентского парсера — нет. - person Tanner Sansbury; 17.06.2012