2015-10-06 33 views
3

使用boost程序選項我試圖讓用戶在配置文件(.ini)中爲多命令參數設置默認值,它們會附加到他們的命令在線選擇。增強程序選項 - 從配置文件追加多選令牌選項到命令行

例子:

程序選項:

m_Desc.add_options() 
    ("settings,s", po::value<string>("FILE")->default_value("~/.config.ini")->multitoken(), "Settings") 
    ("tax,t", po::value<vector<string>>("name|rate")->multitoken(), "Tax") 
; 

try { 

    po::store(
     po::command_line_parser(argc, argv). 
     options(m_Desc). 
     positional(m_Pos). 
     run(), 
     m_Vm); 

    ifstream config(m_Vm["settings"].as<string>(), ifstream::in); 

    if(config) { 
     po::store(
      po::parse_config_file(config, m_Desc), 
      m_Vm); 

    } 

    if (m_Vm.count("help")) { 
     Usage(); 
     return; 
    } 

    po::notify(m_Vm); 

} catch(const po::error &e) { 
    throw MyCustomException(e.what()); 
} 

用戶配置

// config.ini 
tax = gst|7 
tax = vat|5 

// What happens: 
$ ./a.out --tax another|3 
Tax: 
another|3 

$ ./a.out 
Tax: 
gst|7 
vat|5 

// What I'd like: 
$ ./a.out --tax another|3 
Tax: 
gst|7 
another|3 
vat|5 

$ ./a.out 
Tax: 
gst|7 
vat|5 

如何自升壓PO合併多令牌選項而不是覆蓋?

我試過將命令行和配置文件中的選項存儲在單獨的變量映射中,然後合併,但這成爲我的其他命令行選項的問題。

回答

2

你正在尋找的價值功能是->composing()

("settings,s", 
    po::value<string>("FILE")->default_value("~/.config.ini")->multitoken()->composing(), 
    "Settings") 

("tax,t", 
    po::value<vector<string>>("name|rate")->multitoken()->composing(), 
    "Tax") 
+0

啊,小東西我錯過了(www.boost.org/doc/libs/1_55_0/doc/html/program_options/tutorial.html) 。 '對於「組成」選項,如「包含文件」,這些值將被合併。 」。謝謝! –