2013-04-01 26 views
6

OVERKILL demeden önce, umrumda değil.Taşıma '-' with boost.program_options

Boost.program_options öğesinin gerekli cat seçeneğini - karşılamasında nasıl yapabilirim? ,

Ben bir konumsal argüman olarak - görmek istiyorum - ''

tanınmayan seçeneği:

ben cat - - - çalıştırdığınızda bir istisna atar

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

var ve tam dosya listesinde doğru sıraya ihtiyacım var. Bunu nasıl başarabilirim?

GÜNCELLEME Yarım düzeltme var. Ben

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

sorun şu ki sadece 2. almak gibi olduğunu

gerekli üç - zaman çıkış argümanları:

destek :: baskı güzel vektör ve malzeme işleme
if(vm.count("file")) 
    support::print(vm["file"].as<vector<string>>()); 

.

+0

Boost.PO seçeneklerinin sözdizimi kendi (belirli çeşit) vardır kaynak koduna görülebilir. Muhtemelen istediğiniz sözdizimi için Boost.PO kullanabilirsiniz. – Abyx

+0

@Oli: tamamlandı. Teşekkürler. – rubenvb

cevap

4

Sen pozisyonel adlandırılmış programı seçeneği tanımlamak gerekir, sizin durumunuzda o İşte 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; 
    } 
} 

olduğunu var bir coliru demo ve

$ g++ -std=c++11 -O2 -pthread main.cpp -lboost_program_options && ./a.out - - - 
file: - 
file: - 
file: - 
tıklanmasını istemiyorsanız çıktı

Yalnızca 3 konumsal argümandan 2'sini görürseniz, bunun nedeni muhtemelen argv[0]'un program adı olması ve bu nedenle programın adıdır. argüman ayrıştırma için dikkate alınmadı. Bu basic_command_line_parser şablonun

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

Teşekkürler, ama ben zaten bu bölümü anladım. Argv ile uğraşmak boost.program_options beklenen ne değildir ve argv [0] kaldırılmış olsa da, ilk argv göz ardı görünüyor. – rubenvb

+0

@rubenvb muhtemelen soruyu [tag: windows] olarak etiketlemelisiniz veya böyle bir şeyden sonra argv'niz nasıl görünür? –