我正在使用 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
但不知道 key1
或 key3
。然后它会...
- 解析
key2
, - 创建一个包含两个键
key1
和key3
的映射,其值分别为val1
和val2
(比如字符串值)和 - 解析位置参数
positional1
和positional2
。
这样应用程序就可以将 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/