2012-07-21 42 views
1

該應用程序有兩個選項:afilefile是一個位置選項。 afile都有一個string類型的參數,可以省略。 (我爲兩者都設置了一個隱含的空字符串)。Boost程序選項可選參數優先

的期望的行爲如下:

  1. $ program - >file: ""

  2. $ program file.txt - >file: "file.txt"

  3. $ program --a - >a: "", file: ""

  4. $ program --a file.txt - >a: "", file: "file.txt"

  5. $ program --a x file.txt - >a: "x", file: "file.txt"

然而,選項4 intepreted爲a: "file.txt", file: ""。有什麼辦法可以告訴program_options如何解決這種模糊的情況? ($ program --a -- file.txt確實按預期工作,但我希望在沒有額外的情況下也能正常工作。)我正在使用空字符串來表示當前未指定,但這不是必需的。

回答

0

我手動從a移動參數file解決了這個問題,如果a是這樣規定的:

// Fix argument precedence 
if (!vm.count("file") && vm.count("a")) 
{ 
    vm.insert(std::make_pair("file", vm.at("a"))); 
    vm.at("a").as<std::string>() = std::string(); 
} 
0

我會說即使用戶會與這種行爲混淆,而不僅僅是PO。 我不明白爲什麼我不能指定--a沒有file,特別是如果文件具有實施值?隱含的空文件名的目的是什麼,沒有專門的位置選項?我想不出一個。

你可以通過給你的解析器PO來實現你的邏輯,這在文檔中有描述。而且,也是最簡單的,如果file未被傳遞,則可以在解析後手動更改參數。

+0

的'了'單獨選項在默認情況下所有項目操作,而參數允許過濾。 'file'可以明確指定,但如果不是,程序將從配置文件中讀取。 – Ruud 2012-07-22 19:00:31

+0

如果'a'選項的值在邏輯上是足夠的,爲什麼你把它作爲一個隱含的?根據你的話,你允許用戶將過濾器作爲「」(沒有信息),但我相信這沒有意義。如果你不允許「a」的impilicit值,你的(4)中的邏輯將被保留。 – Riga 2012-07-23 10:03:40

+0

未設置隱式空字符串會得到相同的結果。請注意,理想情況下,空字符串與「未指定」的值不同,我使用空字符串來表示「未指定」。過濾器「」等於根本不過濾。 – Ruud 2012-08-01 16:32:53