C++ 如何使用具有多个选项的boost::program_选项通知程序?

C++ 如何使用具有多个选项的boost::program_选项通知程序?,c++,file-io,boost-program-options,C++,File Io,Boost Program Options,我正在写一个物理模拟,用库读取一大堆系统参数,我想“自动”设置一些参数,这些参数是用户输入值的组合。例如,如果我有 [parameters] c0 = 299792458 dt = 0.004 作为输入文件中的光速和时间步长,我想在读取这两个选项后,在用于存储c0和dt的相同结构中设置一个值cdt=c0*dt。据我所知,通知程序是一种使用函数处理输入选项的方法,但我还没有看到一种使用多个选项进行相同操作的方法——最好的方法是什么?我没有看到任何直接选项如何使用boost pro

我正在写一个物理模拟,用库读取一大堆系统参数,我想“自动”设置一些参数,这些参数是用户输入值的组合。例如,如果我有

[parameters]
    c0 = 299792458
    dt = 0.004

作为输入文件中的光速和时间步长,我想在读取这两个选项后,在用于存储
c0
dt
的相同结构中设置一个值
cdt=c0*dt
。据我所知,通知程序是一种使用函数处理输入选项的方法,但我还没有看到一种使用多个选项进行相同操作的方法——最好的方法是什么?

我没有看到任何直接选项如何使用boost program\u选项来实现这一点。只有一个选项被解析后,才会调用通知程序。但是,您可以结合多种变通方法来实现可接受的解决方案-在单独的结构中存储值,让程序_选项在解析完成后填充所有计算值(直接或使用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';
  }
}
#包括
#包括
使用名称空间boost::program_选项;
结构模拟配置{
int c0;
浮动dt;
浮动cdt;
void setCdt(){
cdt=c0*dt;
}
};
int main(int argc,const char*argv[]
{
模拟配置;
尝试
{
选项描述描述{“选项”};
说明添加选项()
(“帮助,h”,“帮助屏幕”)
(“c0”,值(&config.c0),“光速”)
(“dt”,值(&config.dt),“时间间隔”);
变量映射vm;
存储(解析命令行(argc、argv、desc)、vm);
通知(vm);
if(vm.count(“帮助”))

std::cout如果您使用像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");
options\u description desc{“options”};
说明添加选项()
(“帮助,h”,“帮助屏幕”)
(“c0”,
值(&config.c0),
“光速”)
(“dt”,
value(&config.dt)->通知程序([&config](自动){config.setCdt();}),
“时间间隔”);