2016-02-12 89 views
4

我正在使用Boost的program_options庫編寫一個程序。現在,我想允許它使用配置解析器不知道的任意代碼進行擴展 - 但仍然會傳遞給它一些特定的選項。我可以使用Boost program_options獲取多個任意鍵值對嗎?

我的想法是以某種方式傳遞一個鍵值映射,甚至可能是一個program_options :: variable_map。事情是,program_options需要知道哪些選項提前預期,我不能直接使用我喜歡的鍵映射。

所以,我想也許我可以讓program_options接受帶有字符串鍵的任意鍵值對(如果需要的話,字符串值),把這些字符串中的字符串放到字符串或std :: experimental :: any ,然後再傳遞。

爲了更具體一些,我將舉一個例子(儘管它不必完全像這樣)。我會寫:

$ magic_app --key1 val1 --key2 val2 --key3 val3 positional1 positional2 

,並假設program_options知道key2但不是key1key3。然後,它會...

  • 解析key2
  • 創建地圖containins兩個鍵,key1key3,其值val1val2分別爲(比如字符串值),並
  • 解析位置參數positional1positional2

因此,應用程序可以通過自己的參數處理器將地圖(可能經過一些轉換)傳遞給另一個組件。

這是可行的嗎?有沒有更簡單/更好的選擇,我可以使用boost::program_options

注:

  • 一定的相關性this question,這可以作爲一些專用解析後粗的實現 - 鍵將列表中的奇數元素,值將是偶數元素。
  • 用戶必須能夠指定program_options未知的選項,就像所有其他選項一樣。
+0

你能提供一個你想要做什麼的例子(代碼或僞代碼)嗎? – rhashimoto

+0

Boost.ProgramOptions的要點是能夠檢測用戶是否輸入了錯誤的鍵。你基本上只想要一個程序選項* lexer *,它將選項分解爲令牌,你將處理並決定哪些是有效的。 –

回答

1

很多的選項可供選擇:

theProgram.exe --unknown_key_values "key1:value1 key2:value2 ..." 

記號化的空白,然後在「:」讓你的鍵值對。

theProgram.exe --unknown_key_values "--key1 value1 --key2 value2 ..." 

和字符串傳遞到第二program_options解析器知道鍵預期

theProgram.exe --key key1 --value value1 --key key2 --value value2 ... 

,這將給你與每個鍵及其對應的指數值的兩個字符串向量。

theProgram.exe --key1 value1 --key2 value2 ... 

如果key1等是未知的,您將從解析器中得到一個異常,您可以捕獲並處理原始字符串。如果混合使用已知鍵和未知鍵,則必須處理每個未知鍵(將其存儲並將其從命令行中除去),然後循環處理其餘鍵直到您沒有發生異常爲止

+0

啊,沒有。用戶必須指定這些選項,就像它們是常規程序選項一樣。他/她也可以在配置文件中指定它們,'program_options'支持,我當然不希望配置文件看起來像這樣。 – einpoklum

2

您可以定義可多次使用的字符串選項...

( 
    "kvp", 
    boost::program_options::value< std::vector<std::string> >(), 
    "key-value pair" 
) 

...然後該選項,往往你喜歡:

--kvp key1:val1 --kvp key2:val2 

在這一點上,你有你的鍵值對作爲向量中的字符串,這應該很容易解析。

if (vm.count("kvp")) 
{ 
    std::vector<std::string> kvps = vm["kvp"].as< std::vector<std::string> >(); 

    for (size_t n = 0; n < kvps.size(); ++n) 
    { 
     // kvps[n] is one key-value pair 
    } 
} 
相關問題