【问题标题】:How do I use a boost::program_options notifier with multiple options?如何使用带有多个选项的 boost::program_options 通知程序?
【发布时间】:2016-11-07 16:44:33
【问题描述】:

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

[parameters]
    c0 = 299792458
    dt = 0.004

作为我输入文件中的光速和时间步长,我想在读取两个选项后在我用来存储c0dt 的相同结构中设置一个值cdt = c0*dt。据我了解,通知器是一种用函数处理 an 输入选项的方法,但我还没有看到用 multiple 选项做同样事情的方法——这样做的最佳方法是什么?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      如果您使用像 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");
      

      【讨论】:

        猜你喜欢
        • 2016-02-22
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-25
        相关资源
        最近更新 更多