boost :: program_options: возможно ли установить один параметр как значение по умолчанию для другого? - PullRequest
0 голосов
/ 19 января 2019

В настоящее время я пытаюсь реализовать библиотеку boost :: program_options в моей симуляции.При чтении (многих) параметров я хотел бы сделать что-то вроде этого

namespace po = boost::program_options;
po::options_description desc("Allowed options");
desc.add_options()
    ("option1", po::value<int>(&int1), "set value for option1")
    ("option2", po::value<int>(&int2)->default_value(int1), "set value for option2, default is option1")
;

Проблема: default_value (int1) не использует предоставленный int1, если оба параметра даны одновременно (либо для командной строки, либо для конфигурации)файл) и вместо этого использовал значение перед уведомлением ().

Я знаю, что проблему можно решить, просто проверив, предоставлен ли параметр 2, и назначив значение по умолчанию позже.Проблема в том, что я хотел бы избежать написания этого оператора IF для ~ 30 параметров с более чистым решением.

При необходимости это остальная часть кода_программы

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

if (vm.count("config")) {
    std::ifstream cfs(config_file, std::ifstream::in);
    po::store(po::parse_config_file(cfs, desc), vm);
    po::notify(vm);
}

, гдеопция "config" имеет путь config_file в качестве параметра.

1 Ответ

0 голосов
/ 05 марта 2019

Я полагаю, что вы хотите вызвать notify только один раз, в конце.

Я пытался создать для этого уведомитель, но вы не можете изменить значение в variable_map после факта.Лучшее, что я мог придумать, это создать фальшивую переменную, но затем сохранение ее в variable_map стало слишком большой работой, и я сдался!

...