如何使用具有多个选项的 boost::program_options 通知程序?
How do I use a boost::program_options notifier with multiple options?
我正在编写一个物理模拟,它使用 boost::program_options
库读取一大堆系统参数,我想 "automatically" 设置一些作为用户组合出现的参数- 输入值。例如,如果我有
[parameters]
c0 = 299792458
dt = 0.004
作为输入文件中的光速和时间步长,我想在用于存储 c0
和 [=15= 的同一结构中设置一个值 cdt = c0*dt
] 在两个选项都被阅读之后。据我所知,通知程序是一种使用函数处理 an 输入选项的方法,但我还没有看到用 multiple[= 做同样事情的方法23=] 选项 -- 执行此操作的最佳方法是什么?
我没有看到任何直接选项如何使用 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 推荐的配置结构,你就快到了。只需添加一个调用相应 setter:
的通知程序
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");
我正在编写一个物理模拟,它使用 boost::program_options
库读取一大堆系统参数,我想 "automatically" 设置一些作为用户组合出现的参数- 输入值。例如,如果我有
[parameters]
c0 = 299792458
dt = 0.004
作为输入文件中的光速和时间步长,我想在用于存储 c0
和 [=15= 的同一结构中设置一个值 cdt = c0*dt
] 在两个选项都被阅读之后。据我所知,通知程序是一种使用函数处理 an 输入选项的方法,但我还没有看到用 multiple[= 做同样事情的方法23=] 选项 -- 执行此操作的最佳方法是什么?
我没有看到任何直接选项如何使用 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 推荐的配置结构,你就快到了。只需添加一个调用相应 setter:
的通知程序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");