我可以使用Boost program_options来获取多个任意键值对吗?

时间:2016-02-12 11:06:11

标签: c++ c++11 boost key-value 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
  • 创建一个包含两个键key1key3的地图,分别为值val1val2(比如字符串值),
  • 解析位置参数positional1positional2

这样应用程序就可以使用自己的参数处理器将地图(可能在一些转换后)传递给另一个组件。

这可行吗?是否有一个更简单/更好的替代方案,我可以使用boost::program_options

备注:

  • this question有些相关,可以作为一个粗略的实现,有一些解析后 - 键将是列表中的奇数元素,值将是偶数元素。
  • 用户必须能够像所有其他选项一样指定program_options未知的选项。

2 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分:1)

有很多选择可供选择:

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

对空白进行标记,然后对#34;进行标记:&#34;获得你的键值对。

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等未知,您将从解析器中获取异常,您可以捕获并处理原始字符串。如果你有已知和未知密钥的混合,你将必须处理每个未知密钥(存储它并将其从命令行中剥离)然后循环处理剩余的密钥,直到你没有得到异常