我正在使用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
。这样应用程序就可以使用自己的参数处理器将地图(可能在一些转换后)传递给另一个组件。
这可行吗?是否有一个更简单/更好的替代方案,我可以使用boost::program_options
?
备注:
program_options
未知的选项。答案 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等未知,您将从解析器中获取异常,您可以捕获并处理原始字符串。如果你有已知和未知密钥的混合,你将必须处理每个未知密钥(存储它并将其从命令行中剥离)然后循环处理剩余的密钥,直到你没有得到异常