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

标签 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

这样应用程序就可以将 map (可能经过一些转换)传递给另一个具有自己的参数处理器的组件。

这可行吗? boost::program_options 是否有更简单/更好的替代方案?

注意事项:

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

最佳答案

你可以定义一个可以多次给出的字符串选项...

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

...然后给予您喜欢的次数:

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

此时,您将键值对作为 vector 中的字符串,这应该很容易解析。

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

    for ( auto & kvp : kvps )
    {
        // kvp is one key-value pair
    }
}

关于c++ - 我可以使用 Boost program_options 获取多个任意键值对吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35361036/

相关文章:

c++ - 使用 C++ boost 库如何创建两个圆并将它们添加到 boost R 树中?

c++ - 如何包含 DLL 的类?

c++ - 在哪里可以找到标准的 Visual C++ 头文件?

c++ - libjpeg 自定义源管理器

c++ - 如何在 Windows 上更新已安装库的位置?

c++ - 预期 { 在析构函数之前

c++ - 强制将对象作为拷贝传递给接收通用引用的函数

c++ - 使用 Boost.Geometry 偏移多边形?

c++ - 来自 C++ 标准容器的 boost ptr_array 的替代方案

c++ - 我可以将 boost asio 用于 HTTPS 请求吗