2012-06-16 13 views
7

De acuerdo con la documentación que puedo analizar archivos de configuración en el estilo:Boost - reciben todas las entradas en la sección

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

pero necesito a la lista de plugins analizar:

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

¿Cómo puedo conseguir vector de cadenas que están en la sección de complementos?

Respuesta

10

Para aumentar los archivos de configuración de opciones del programa, si la línea no está declarando una sección, como [settings], entonces debe estar en un formato name=value. Por su ejemplo, escribir como la siguiente:

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

La lista de plugins corresponderá ahora a la opción "plugins.name", que tiene que ser una opción de la modalidad Multi.

continuación se muestra un ejemplo de programa que lee los ajustes anteriores de un archivo 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; 
} 

que produce el siguiente resultado:

plugin.name: somePlugin 
plugin.name: HelloWorldPlugin 
plugin.name: AnotherPlugin 
settings.type: hello world
+0

Gracias, así que no hay manera de cómo hacerlo sin tener que tener "name =" antes del nombre del plugin? – user1307957

+0

Sin escribir su propio analizador de clientes, no. –

+0

Ok, no importa. – user1307957

Cuestiones relacionadas