c++ - 如何使用具有多个选项的 boost::program_options 通知程序?

标签 c++ file-io boost-program-options

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

[parameters]
    c0 = 299792458
    dt = 0.004

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

最佳答案

我没有看到任何直接选项如何使用 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';
  }
}

关于c++ - 如何使用具有多个选项的 boost::program_options 通知程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40470241/

相关文章:

c# - 读写二进制文件的最快方法

Java 检查 file.exists() 是否不能与 ImageIO.read(file) 一起使用

c++ - 我可以使用 Boost::program_options 将可猜测和不可猜测的选项一起解析吗?

c++ - 使用 boost::program_options 指定多个标志

c++ - 用OpenGL画圆

c++ - double 到 string 到 double 的转换抛出异常

c++ - 您最喜欢/推荐的使用 Boost 进行单元测试的项目结构和文件结构是什么?

c++ - 静态成员函数中静态变量的同名

python - 使用 py2app 一旦 python 为 "compiled",open()/f.write() 就不起作用

c++ - boost 库中无法识别的错误