6

あなたが OVERKILL と言う前に、私は気にしません。

Boost.program_options で必要なcatオプションを処理するにはどうすればよい-ですか?

私は持っている

// visible
po::options_description options("Options");
options.add_options()("-u", po::value<bool>(), "Write bytes from the input file to the standard output without delay as each is read.");

po::positional_options_description file_options;
file_options.add("file", -1);

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

bool immediate = false;
if(vm.count("-u"))
  immediate = true;
if(vm.count("file"))
  support::print(vm["file"].as<vector<string>>());

実行すると例外がスローされますcat - - -

認識されないオプション '-'

位置引数として表示したいのです-が、完全なファイルリストで正しい順序で必要です。どうすればこれを達成できますか?

アップデート

私は半分修正しています。必要だった

po::options_description options("Options");
options.add_options()("-u", po::value<bool>(), "Write bytes from the input file to the standard output without delay as each is read.")
                    ("file", po::value< vector<string> >(), "input file");

po::positional_options_description file_options;
file_options.add("file", -1);

-問題は、引数を出力すると、3 つのうち 2 つしか得られないように見えることです。

if(vm.count("file"))
  support::print(vm["file"].as<vector<string>>());

どこで support::print がベクターなどを適切に処理します。

4

1 に答える 1

4

位置的な名前付きプログラムオプションを定義する必要があります。あなたの場合はfile

#include <boost/foreach.hpp>
#include <boost/program_options.hpp>

#include <iostream>
#include <string>
#include <vector>

namespace po = boost::program_options;

int
main( int argc, char* argv[] )
{
    std::vector<std::string> input;
    po::options_description options("Options");
    options.add_options()
        ("-u", po::value<bool>(), "Write bytes from the input file to the standard output without delay as each is read.")
        ("file", po::value(&input), "input")
        ;

    po::positional_options_description file_options;
    file_options.add("file", -1);

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

    bool immediate = false;
    if(vm.count("-u"))
        immediate = true;
    BOOST_FOREACH( const auto& i, input ) {
        std::cout << "file: " << i << std::endl;
    }
}

クリックスルーしたくない場合は、coliru のデモと出力を次に示します。

$ g++ -std=c++11 -O2 -pthread main.cpp -lboost_program_options && ./a.out - - -
file: -
file: -
file: -

3 つの位置引数のうち 2 つしか表示されない場合argv[0]は、慣例により がプログラム名である可能性が高いため、引数の解析では考慮されません。basic_command_line_parserこれは、テンプレートのソース コードで確認できます。

 37     template<class charT>
 38     basic_command_line_parser<charT>::
 39     basic_command_line_parser(int argc, const charT* const argv[])
 40     : detail::cmdline(
 41         // Explicit template arguments are required by gcc 3.3.1 
 42         // (at least mingw version), and do no harm on other compilers.
 43         to_internal(detail::make_vector<charT, const charT* const*>(argv+1, argv+argc+!argc)))
 44     {}
于 2013-04-01T19:47:50.980 に答える