2013-04-01 50 views
6

在你說OVERKILL之前,我不在乎。用boost.program_options處理' - '

我該如何讓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 - - -會拋出一個異常:

無法識別的選項 ' - '

我希望看到-的位置參數,我需要在完整的文件列表中以正確的順序。我怎麼能做到這一點?

UPDATE

我有一個半修復。我需要

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

問題是,我似乎只得到2三-當我輸出的參數:

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

其中支持::印刷精美的處理矢量和東西。

+0

Boost.PO具有其自己的(有限的)選項語法。可能你可以使用Boost.PO來獲得你想要的語法。 – Abyx

+0

@Oli:完成。謝謝。 – rubenvb

回答

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 demo,如果你不想通過

$ 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  {} 
+0

謝謝,但我已經明白了這一點。看起來我對argv的干預不是boost.program_options的預期,它忽略了第一個argv,儘管我刪除了argv [0]。 – rubenvb

+0

@rubenvb你應該把這個問題標記爲[tag:windows]或者其他的,你的'argv'看起來像什麼? –