boost::program_options::options_description не работает для упрощенного имени команды

#c #boost

#c #boost

Вопрос:

 #include <boost/program_options.hpp>
namespace bpo = boost::program_options;

int main(int argc, char* argv[])
{
    int apple_num = 0, orange_num = 0;
    std::vector<std::string> addr;
    bpo::options_description opt("all options");

    opt.add_options()
        ("apple,a", bpo::value<int>(amp;apple_num)->default_value(10), "apple count")
        ("orange,o", bpo::value<int>(amp;orange_num)->default_value(20), "orange count")
        ("help", "apple orange=");

    bpo::variables_map vm;

    try {
        bpo::store(parse_command_line(argc, argv, opt), vm);
    }
    catch (...) {
        std::cout << "errorn";
        return 0;
    }

    bpo::notify(vm);

    if (vm.count("help")) {
        std::cout << opt << std::endl;
        return 0;
    }

    std::cout << "apple count:" << apple_num << std::endl;
    std::cout << "orange count:" << orange_num << std::endl;
    std::cout << "sum:" << orange_num   apple_num << std::endl;
    return 0;
}
 

Это работает для полного имени команды как —apple или —orange

 D:testForTestDebug> .ForTest.exe --apple=100 --orange=99
apple count:100
orange count:99
sum:199
 

Но это не удается для —a или -a для упрощенного —apple, я уже добавил как полное, так и упрощенное имя команды «apple,a».

 PS D:testForTestDebug> .ForTest.exe -a=99
error
PS D:testForTestDebug>
 

Почему?

Ответ №1:

Выбранный стиль командной строки не ожидает знака равенства с короткими параметрами:

 ./sotest  -a=99
error
 

Но

 ./sotest  -a 99
apple count:99
orange count:20
sum:119
 

Чтобы исправить ожидания:

 auto style = bpo::command_line_style::default_style 
    | bpo::command_line_style::allow_long_disguise
    ;
bpo::store(parse_command_line(argc, argv, opt, style), vm);
 

Теперь вы получаете

Жить на Колиру

   ./sotest -a 7
apple count:7
orange count:20
sum:27
  ./sotest -a8
apple count:8
orange count:20
sum:28
  ./sotest -a=9
apple count:9
orange count:20
sum:29
  ./sotest --apple=100 --orange=31
apple count:100
orange count:31
sum:131
 

Комментарии:

1. Так здорово! Спасибо!