19

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>&&’
4

3 に答える 3

5

ストリーミングの説明はオプションのみを出力することに注意してください。プログラムの名前や、プログラムが何をするかの実際の説明は表示されません。出力メッセージの一部として、位置パラメータを手動で出力する必要があります。

それ以外の

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;
}
于 2013-01-02T19:03:46.920 に答える
2

boost :: program_options :: positional_options_description.name_for_position(i)を見てください

エラーメッセージは無関係です。cpp11との関係を忘れています。

于 2013-01-02T19:06:29.237 に答える
2

これは、位置オプションを自動的に印刷するために私が行うことです:

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 では、オプションの説明が位置に関するものかどうかを判断する方法がないため、たとえば、位置に関するオプションを出力から除外するなど、ヘルプを改善する必要はありません。

于 2018-11-28T08:39:27.223 に答える