2012-06-16 7 views
7

Dokumentation Nach I-Konfigurationsdateien in der Art analysieren kann:Boost-Programm-Optionen - erhalten alle Einträge in Abschnitt

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

Aber ich brauche zu analysieren Liste des Plugins:

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

Wie kann ich Vektor von Strings, die im Plugins-Bereich sind?

Antwort

10

Wenn die Option config-Dateien für Programmoptionen aktiviert ist, wenn die Zeile keinen Abschnitt deklariert, z. B. [settings], muss sie in einem Format name=value vorliegen. Für Ihr Beispiel, schreiben Sie es wie folgt:

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

Die Liste der Plugins nun auf die „plugins.name“ Option entsprechen wird, die eine Multitoken Option sein muss.

Unten ist ein Beispielprogramm, das die oben genannten Einstellungen aus einer Datei settings.ini lautet:

#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; 
} 

, die die folgende Ausgabe erzeugt:

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

Danke, so ist es nicht Art und Weise, wie man tun Sie es, ohne "name =" vor plugin name zu haben? – user1307957

+0

Ohne Ihren eigenen Kundenparser zu schreiben, nein. –

+0

Ok, vergiss es. – user1307957

Verwandte Themen