当您使用Boost库program_options
时,可以很容易地为您的程序打印帮助:
boost::program_options::variables_map options;
boost::program_options::options_description optionsDesc;
boost::program_options::positional_options_description positionalOptionsDesc;
//...
if(options.count("help"))
{
cerr << optionsDesc << endl;
}
但是如何将positional_options_description
中的选项添加到帮助消息中?在本教程中,我可以在该部分的末尾看到这种设置的输出:
http://www.boost.org/doc/libs/1_52_0/doc/html/program_options/tutorial.html#id2607297
选项input-file
打印在帮助中,它是位置的。但我看不到代码。
是否有内置的方式来打印它,就像使用options_description
一样,或者您必须手动执行此操作?显然<<
对positional_options_description
不起作用,编译错误是:
error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’
答案 0 :(得分:4)
请注意,流媒体描述仅打印出选项。它不会打印程序的名称或程序的实际描述。您应该手动打印输出消息中的任何位置参数:
而不是
if (vm.count("help")) {
cout << "Usage: options_description [options]\n";
cout << desc;
return 0;
}
你可以很容易地说
if (vm.count("help")) {
cout << "Usage: " << argv[0] << " [options] <description of positional 1> <description of positional 2> ...\n";
cout << desc;
return 0;
}
答案 1 :(得分:1)
看一下boost :: program_options :: positional_options_description.name_for_position(i)
错误信息是无关的,我忘了与cpp11
有什么关系答案 2 :(得分:0)
这是我自动打印位置选项的方法:
void printUsage(const std::string &argv0)
{
std::ostream &os = std::cout;
os << "Usage:" << std::endl;
// print only basename of argv[0]
boost::filesystem::path p(argv0);
os << " " << p.filename().string();
os << " [options]";
std::string last = "";
int rep = 0;
for(int i = 0; i < positional_options_description_.max_total_count(); i++)
{
const std::string &n = positional_options_description_.name_for_position(i);
if(n == last)
{
if(!rep) os << " ...";
if(rep++ > 1000) break;
}
else
{
os << " " << n;
last = n;
rep = 0;
}
}
os << std::endl << std::endl;
os << options_description_ << std::endl;
}
仅当您具有可以重复无数次(即count等于-1)的重复选项时,才需要使用用于检查重复参数名称的逻辑。否则,您可以将其简化一点,例如将if... else if ...
替换为os << " " << n;
。
在当前(1.68)版本的boost中,无法判断选项描述是否为位置描述,因此无助于改善帮助,例如,排除位置选项的显示。