5

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

オプションの説明file1を表示できません。file2もちろん、それらを に追加することもできますがoptions、これにより少なくとも 2 つの不要な引数が追加されることになり[-]-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.

ライブラリをハッキングせずにこれを達成する方法はありますか? これはかなり基本的なものだと思いますが、どのチュートリアルにもありません。

更新みんなの利益のために、うまくいけば後方互換性のある方法で、これに対する機能要求を送信しました。

4

1 に答える 1

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歳です。)

于 2013-04-07T14:54:04.857 に答える