提升program_options解析选项和参数一起

boost program_options parse option and argument together

本文关键字:选项 参数 一起 program options 提升      更新时间:2023-10-16
#include <boost/program_options.hpp>
#include <iostream>
#include <string>
#include <stdexcept>

void basic_approach(int argc, char const *argv[])
{
    try
    {            
        options_description desc{"Options"};
        desc.add_options()
                ("help,h", "Help screen")
                ("pi,p", value<float>()->default_value(3.14f), "Pi")                   
                ("bool,b", value<bool>()->default_value(false), "bool");
        variables_map vm;
        store(parse_command_line(argc, argv, desc), vm);
        notify(vm);

        if (vm.count("help")){
            std::cout << desc << 'n';
        }            
        if (vm.count("pi")){
            std::cout << "Pi: " << vm["pi"].as<float>() << 'n';
        }
        if(vm.count("bool")){
            std::cout<<"bool: "<<vm["bool"].as<bool>() <<"n";
        }
    }
    catch (const error &ex)
    {
        std::cerr << ex.what() << 'n';
    }
}
int main(int argc, char const *argv[])
{
    basic_approach(argc, argv);
}

当我进入"test.exe --pi 334"时,程序运行完美。
但它cannot parse "test.exe --pi334"但抛出异常

"unrecognised option '--pi334'"

boost是否可以解析像"--pi334"这样的选项?多谢

#include <boost/program_options.hpp>
#include <iostream>
#include <string>
#include <stdexcept>

void basic_approach(int argc, char const *argv[])
{
    try
    {            
        options_description desc{"Options"};
        desc.add_options()
                ("help,h", "Help screen")
                ("pi,p", value<float>()->default_value(3.14f), "Pi")                   
                ("bool,b", value<bool>()->default_value(false), "bool");
        command_line_parser parser(argc, argv);
        parser.options(desc).style(
                    command_line_style::default_style |
                    command_line_style::allow_sticky);
        parsed_options parsed_options = parser.run();
        variables_map vm;
        store(parsed_options, vm);
        notify(vm);
        if (vm.count("help")){
            std::cout << desc << 'n';
        }            
        if (vm.count("pi")){
            std::cout << "Pi: " << vm["pi"].as<float>() << 'n';
        }
        if(vm.count("bool")){
            std::cout<<"bool: "<<vm["bool"].as<bool>() <<"n";
        }
    }
    catch (const error &ex)
    {
        std::cerr << ex.what() << 'n';
    }
}
int main(int argc, char const *argv[])
{
    basic_approach(argc, argv);
}

感谢您的帮助,我只需要并command_line_style::allow_sticky即可使其工作