2009-11-26 73 views
12

我正在使用boost :: program_options庫來處理命令行參數。 我需要通過-r選項接受文件名,如果它是空的(-r沒有參數給出),我需要使用stdin。如何接受boost :: program_options中的空值

desc.add_options() 
("replay,r", boost::program_options::value<std::string>(), "bla bla bla") 

在這種情況下,boost不會接受沒有參數的-r,並拋出異常。 default_value()選項不起作用,因爲即使用戶沒有給出-r選項,它也會使庫返回值。

任何想法如何解決?

回答

26

請使用implicit_value方法,e.g

desc.add_options() 
("replay,r", po::value<std::string>()->implicit_value("stdin"), "bla bla bla") 

這使得選項接受0或1令牌,並且如果沒有提供令牌,它將充當如果「標準輸入」被提供爲。當然,你可以選擇任何其他隱含的值 - 包括由mch建議的空字符串和' - '。

+0

謝謝!完美的作品 – cppalex 2009-11-28 14:08:36

+0

@Vladimir Prus,這裏是另一個關於在這裏沒有值的選項的問題http://stackoverflow.com/questions/7174781/boost-program-options-notifier-for-options-with-no-value 我想能夠爲這些選項添加通告或者編寫補丁來啓用它。請,評論,謝謝。 – Riga 2011-08-26 20:21:05

+0

不幸的是,由於某種原因,當INI文件中給出一個空的值時,這不起作用。 – 2017-02-21 07:13:17

1

我不認爲任何命令行解析庫允許你有選擇,可以採取參數或不參與。如果一個選項需要一個參數,你必須給一個參數。在這種情況下,標準慣例(在* NIX中)是使用' - '作爲文件名來表示你想從標準輸入中讀取。

+0

Boost :: program_options * does *通過zero_tokens()允許這一點。 – Rhubbarb 2011-09-30 15:55:18

5

你可以嘗試用multitokenzero_tokens選項一招:

using namespace std; 
namespace po = boost::program_options; 

vector<string> replay; 

po::options_description desc("Allowed options"); 
desc.add_options() 
    ("replay,r", po::value< vector<string> >(&replay)->multitoken()->zero_tokens(), "bla bla bla"); 

po::variables_map vm;   
po::store(po::parse_command_line(argc, argv, desc), vm); 
po::notify(vm);  

if (vm.count("replay")) 
{ 
    size_t s = vm["replay"].as< vector<string> >().size(); 
    if (s == 0) 
    cout << "replay without args" << endl; 
    else if (s == 1) 
    cout << "replay with one arg" << endl; 
    else 
    cout << "replay with multiple args" << endl; 
} 
else 
    cout << "replay not specified" << endl; 

然後僅計算replay向量元素的數量。如果將多個參數傳遞給重播選項,那麼您會想要引發錯誤。

相關問題