C++ boost程序选项短/长参数名称

C++ boost程序选项短/长参数名称,c++,boost,C++,Boost,我已经实现了一个路由,通过迭代po::variable\u映射,打印出我的boost::program\u options对象中可用的所有选项及其当前值 有了它,我可以直接打印选项的长名称及其值。但是,我不知道如何从长选项名中检索短选项名(即-h from--help)。有什么建议吗?我记得在最近的回答中描述了为什么variable\u map对选项描述“太晚了”: 简而言之,变量_映射位于库的内部,因此与选项描述(位于中)隔离 你能做什么? 您可以使用中间结果,即来自以下对象的原始输出:

我已经实现了一个路由,通过迭代
po::variable\u映射
,打印出我的
boost::program\u options
对象中可用的所有选项及其当前值


有了它,我可以直接打印选项的长名称及其值。但是,我不知道如何从长选项名中检索短选项名(即-h from--help)。有什么建议吗?

我记得在最近的回答中描述了为什么
variable\u map
对选项描述“太晚了”:

简而言之,变量_映射位于库的内部,因此与选项描述(位于中)隔离

你能做什么? 您可以使用中间结果,即来自以下对象的原始输出:

解析结果作为类的实例返回。通常,该对象直接传递给存储组件。但是,它也可以直接使用,或进行一些附加处理

那么,让我们在这里尝试制作一个示例:

    po::parsed_options const intermediate = po::parse_command_line(ac, av, desc);

    //////////////////////////////////
    // print the extended usage info as per the question
    //
    for (auto& entry : intermediate.options)
    {
        po::option_description const& opt = desc.find(entry.string_key, false, false, false); 

        std::cout << "\nActual tokens involved: ";
        for (auto& tok : entry.original_tokens)
            std::cout << "'" << tok << "' ";
        for (std::string const& v : entry.value)
            std::cout << "\nAssociated value: " << v;
        std::cout << "\n-----------------------------------------------------------\n";
        std::cout << "opt.format_name()        : "        << opt.format_name()                                      << "\n";
        std::cout << "opt.long_name()          : "        << opt.long_name()                                        << "\n";
        std::cout << "opt.canonical_display_name('-'): "  << opt.canonical_display_name(cls::allow_dash_for_short)  << "\n";
        std::cout << "opt.canonical_display_name('/'): "  << opt.canonical_display_name(cls::allow_slash_for_short) << "\n";
        std::cout << "opt.canonical_display_name('--'): " << opt.canonical_display_name(cls::allow_long)            << "\n";
    }

#include <boost/program_options.hpp>
#include <boost/program_options/detail/parsers.hpp>
#include <iostream>

namespace po  = boost::program_options;
namespace cls = po::command_line_style;

int main(int ac, char** av) {
    // Declare the supported options.
    po::options_description desc("Allowed options");
    desc.add_options()
        ("help", "produce help message")
        ("name,n", po::value<std::string>(), "specify the name")
        ("compression,C", po::value<int>(), "set compression level")
        ;

    po::variables_map vm;
    po::parsed_options const intermediate = po::parse_command_line(ac, av, desc);

    //////////////////////////////////
    // print the extended usage info as per the question
    //
    for (auto& entry : intermediate.options)
    {
        po::option_description const& opt = desc.find(entry.string_key, false, false, false); 

        std::cout << "\nActual tokens involved: ";
        for (auto& tok : entry.original_tokens)
            std::cout << "'" << tok << "' ";
        for (std::string const& v : entry.value)
            std::cout << "\nAssociated value: " << v;
        std::cout << "\n-----------------------------------------------------------\n";
        std::cout << "opt.format_name()        : "        << opt.format_name()                                      << "\n";
        std::cout << "opt.long_name()          : "        << opt.long_name()                                        << "\n";
        std::cout << "opt.canonical_display_name('-'): "  << opt.canonical_display_name(cls::allow_dash_for_short)  << "\n";
        std::cout << "opt.canonical_display_name('/'): "  << opt.canonical_display_name(cls::allow_slash_for_short) << "\n";
        std::cout << "opt.canonical_display_name('--'): " << opt.canonical_display_name(cls::allow_long)            << "\n";
    }

    //////////////////////////////////

    po::store(intermediate, vm);
    po::notify(vm);    

    if (vm.count("help")) {
        std::cout << desc << "\n";
        return 1;
    }

    if (vm.count("compression")) {
        std::cout << "Compression level was set to " 
            << vm["compression"].as<int>() << ".\n";
    } else {
        std::cout << "Compression level was not set.\n";
    }
}
#包括
#包括
#包括
名称空间po=boost::program\u选项;
名称空间cls=po::命令行样式;
内部主(内部ac,字符**av){
//声明支持的选项。
采购订单:选项描述描述(“允许选项”);
说明添加选项()
(“帮助”,“生成帮助消息”)
(“名称,n”,po::value(),“指定名称”)
(“压缩,C”,po::value(),“设置压缩级别”)
;
变量映射虚拟机;
po::parsed_options const mediate=po::parse_命令行(ac、av、desc);
//////////////////////////////////
//根据问题打印扩展使用信息
//
用于(自动输入:中间。选项(&E)
{
po::option_description const&opt=desc.find(entry.string_key,false,false);

std::cout如果您愿意,您仍然可以看到我是如何在这个API中跌跌撞撞地完成的:并且()如果我们只希望选项的名称不带“-”或“--”,那么opt.canonical\u display\u name(0)/opt.canonical\u display\u name(默认样式)似乎有效。对吗?这对配置文件选项也有效吗?@abhishekgupta我想是的。但这很容易检查。也很难想出其他的理论。
#include <boost/program_options.hpp>
#include <boost/program_options/detail/parsers.hpp>
#include <iostream>

namespace po  = boost::program_options;
namespace cls = po::command_line_style;

int main(int ac, char** av) {
    // Declare the supported options.
    po::options_description desc("Allowed options");
    desc.add_options()
        ("help", "produce help message")
        ("name,n", po::value<std::string>(), "specify the name")
        ("compression,C", po::value<int>(), "set compression level")
        ;

    po::variables_map vm;
    po::parsed_options const intermediate = po::parse_command_line(ac, av, desc);

    //////////////////////////////////
    // print the extended usage info as per the question
    //
    for (auto& entry : intermediate.options)
    {
        po::option_description const& opt = desc.find(entry.string_key, false, false, false); 

        std::cout << "\nActual tokens involved: ";
        for (auto& tok : entry.original_tokens)
            std::cout << "'" << tok << "' ";
        for (std::string const& v : entry.value)
            std::cout << "\nAssociated value: " << v;
        std::cout << "\n-----------------------------------------------------------\n";
        std::cout << "opt.format_name()        : "        << opt.format_name()                                      << "\n";
        std::cout << "opt.long_name()          : "        << opt.long_name()                                        << "\n";
        std::cout << "opt.canonical_display_name('-'): "  << opt.canonical_display_name(cls::allow_dash_for_short)  << "\n";
        std::cout << "opt.canonical_display_name('/'): "  << opt.canonical_display_name(cls::allow_slash_for_short) << "\n";
        std::cout << "opt.canonical_display_name('--'): " << opt.canonical_display_name(cls::allow_long)            << "\n";
    }

    //////////////////////////////////

    po::store(intermediate, vm);
    po::notify(vm);    

    if (vm.count("help")) {
        std::cout << desc << "\n";
        return 1;
    }

    if (vm.count("compression")) {
        std::cout << "Compression level was set to " 
            << vm["compression"].as<int>() << ".\n";
    } else {
        std::cout << "Compression level was not set.\n";
    }
}