如何在--help输出中显示命令行操作符描述

时间:2013-04-07 13:43:24

标签: c++ boost boost-program-options

我正在使用Boost.program_options来解析我实现POSIX实用程序的命令行。举个简单的例子,请cmp

现在我希望有一个额外的参数--help,它显示了所有参数的描述,在这种情况下这很重要。我有:

po::options_description options("Options");
options.add_options()("help", "Show this help output.")
                     (",l", "(Lowercase ell.) Write the byte number (decimal) and the differing bytes (octal) for each difference.")
                     (",s", "Write nothing for differing files; return exit status only.")

po::positional_options_description operands;
operands.add("file1", 1);//, "A pathname of the first file to be compared. If file1 is '-', the standard input shall be used.")
operands.add("file2", 1);//, "A pathname of the second file to be compared. If file2 is '-', the standard input shall be used.");

po::variables_map vm;
po::store(po::command_line_parser(argc, argv).options(options).positional(operands).run(), vm);
po::notify(vm);

if(vm.count("help"))
{
  std::cout << "cmp: compare two files\nUsage: cmp [ -l | -s ] file1 file2\n" << options;
  return 0;
}

无法显示file1file2选项'说明。我当然可以将它们添加到options,但这会添加至少两个不需要的参数[-]-file{1,2},这是我真的不想要的。我只想要--help的这个输出(显然没有硬编码):

cmp: compare two files
Usage: cmp [ -l | -s ] file1 file2
Options:
  --help                Show this help output.
  -l                    (Lowercase ell.) Write the byte number (decimal) and the differing bytes (octal) for each difference.
  -s                    Write nothing for differing files; return exit status only.
Operands:
  file1                 A pathname of the first file to be compared. If file1 is '-', the standard input shall be used.
  file2                 A pathname of the second file to be compared. If file2 is '-', the standard input shall be used.

有没有办法在不乱砍图书馆的情况下实现这一目标?我认为这是非常基本的东西,但我无法在任何tutorials中找到它。

更新为了每个人的利益,我为此提交了feature request,希望以向后兼容的方式。

1 个答案:

答案 0 :(得分:1)

这不是理想的,但如何创建一个“虚拟”程序选项,让boost :: program_options格式化程序为您设置帮助文本格式,然后只需快速替换删除破折号?

然后输出除options帮助文本之外的帮助文本。

这样的事情:

po::options_description dummy_options("Operands");
dummy_options.add_options()
    ("file1", po::value<std::string>(), "A pathname of the first file to be compared. If file1 is '-', the standard input shall be used.")
    ("file2", po::value<std::string>(), "A pathname of the second file to be compared. If file2 is '-', the standard input shall be used.")
    ;

std::stringstream s;
s << dummy_options;
std::string dummy_help_text = s.str();
boost::replace_all(dummy_help_text, "--", "");
boost::replace_all(dummy_help_text, "arg", "     ");

std::cout << dummy_help_text << std::endl;

输出如下:

Operands:
  file1                 A pathname of the first file to be compared. If file1
                        is '-', the standard input shall be used.
  file2                 A pathname of the second file to be compared. If file2
                        is '-', the standard input shall be used.

这并不理想,因为除其他外,列之间的间距与其他options输出的帮助输出不匹配。但是对于快速和肮脏的东西,这基本上可行,它可能没问题。

无论如何,这是一个想法。

(我在Boost.Program_Options API中没有看到任何允许你以“正确”方式执行此操作的内容。https://stackoverflow.com/a/3621947/368896提示不支持此类内容,但这是3现在岁了。)