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";
}
}