15

我的程序(prog.exe)相互排斥的選項設置支持以下四個標誌:-P-p-b-s。但是:的升壓方案選擇

  • -b-p必須一起指定,構成一組,並且具有數字值例如-b 42
  • -s不能與上述組指定,並且反之亦然
  • -P是在這兩種情況下

這樣prog.exe只能運行如任一

prog.exe -P -s 

強制性
prog.exe -P -b -42 -p 8 

有沒有辦法在boost程序選項中指定上述互斥命令行選項集?

+1

這是在boost :: program_options客戶端應用程序的恕(恕)''parseOptions()'方法中實現的邏輯的一部分。 – 2013-03-22 18:10:41

+2

我遇到過這種情況,通常將它們映射到某些「程序執行模式」枚舉選項。我第一次查找這個選項設置和確定後,繼續具體的選項... – 2013-03-22 18:15:35

回答

17

您應該從幾個教程[1][2]開始瞭解boost::program_options如何工作。

然後,您可以定義兩個相互排斥的選項,只需定義一個小函數,如real.cpp中所述。例如,您可以指定兩個互相沖突(或視)選項定義conflicting_options()功能:

void conflicting_options(const boost::program_options::variables_map & vm, 
         const std::string & opt1, const std::string & opt2) 
{ 
    if (vm.count(opt1) && !vm[opt1].defaulted() && 
     vm.count(opt2) && !vm[opt2].defaulted()) 
    { 
     throw std::logic_error(std::string("Conflicting options '") + 
           opt1 + "' and '" + opt2 + "'."); 
    } 
} 

,然後調用後boost::program_options::store()

conflicting_options (vm, "quiet", "verbose"); 

好吧,我還是如果它不理解可以定義兩個互斥的位置選項,但這應該是另一個問題。

+3

在我看來它是這麼多樣板代碼!爲什麼不能像python的argparse那樣提升互相支持的支持呢? – Asalle 2017-01-31 15:06:11

+0

Python幾乎總是比C++更簡潔,它一直都是。 C++ 11/14/17正朝着這個方向前進,但速度緩慢。 – Avio 2017-02-09 12:04:53