2016-02-12 88 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 
    } 
} 
相关问题