如何在多个选项中使用boost :: program_options通告器?

问题描述:

我正在写一个物理模拟,用boost::program_options库读入一大堆系统参数,我想“自动”设置一些参数,这些参数是用户输入值的组合。举例来说,如果我有如何在多个选项中使用boost :: program_options通告器?

[parameters] 
    c0 = 299792458 
    dt = 0.004 

在我输入文件光和时间步的速度,我想在相同的结构设置值cdt = c0*dt我使用存储两个选项后c0dt阅读。据我所知,通知是一种处理输入选项的方法,但我还没有看到与多个选项做同样的事情的方法 - 要做到这一点,最好的方法是什么?

我没有看到任何直接的选择如何使用boost program_options来实现此目的。只有一个选项被解析后才会调用通知器。但是,您可以结合使用几种解决方法来实现可接受的解决方案 - 将值存储在单独的结构中,让program_options在解析完成后填充所有计算值(直接或使用setter函数)。

我简单的建议:

#include <boost/program_options.hpp> 
#include <iostream> 

using namespace boost::program_options; 

struct SimulationConfig { 
    int c0; 
    float dt; 
    float cdt; 

    void setCdt() { 
    cdt = c0*dt; 
    } 
}; 

int main(int argc, const char *argv[]) 
{ 

    SimulationConfig config; 
    try 
    { 
    options_description desc{"Options"}; 
    desc.add_options() 
     ("help,h", "Help screen") 
     ("c0", value<int>(&config.c0), "Speed of light") 
     ("dt", value<float>(&config.dt), "Time interval"); 

    variables_map vm; 
    store(parse_command_line(argc, argv, desc), vm); 
    notify(vm); 


    if (vm.count("help")) 
     std::cout << desc << '\n'; 
    else if (vm.count("c0") && vm.count("dt")) { 
     //config.cdt = vm["c0"].as<int>() * vm["dt"].as<float>(); 
     config.setCdt(); 
     std::cout << "Cdt is set to: " << config.cdt << std::endl; 
    } 

    } 
    catch (const error &ex) 
    { 
    std::cerr << ex.what() << '\n'; 
    } 
} 

如果您使用的配置结构像pe3k建议就快成功了。只需添加一个通知程序即可调用相应的设置程序:

options_description desc{"Options"}; 
desc.add_options() 
    ("help,h", "Help screen") 
    ("c0", 
    value<int>(&config.c0), 
    "Speed of light") 
    ("dt", 
    value<float>(&config.dt)->notifier([&config](auto){ config.setCdt(); }), 
    "Time interval");