我可以使用Boost program_options获取多个任意键值对吗?
我正在使用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
但不是key1
或key3
。然后,它会...
- 解析
key2
, - 创建地图containins两个键,
key1
和key3
,其值val1
和val2
分别为(比如字符串值),并 - 解析位置参数
positional1
和positional2
。
因此,应用程序可以通过自己的参数处理器将地图(可能经过一些转换)传递给另一个组件。
这是可行的吗?有没有更简单/更好的选择,我可以使用boost::program_options
?
注:
- 一定的相关性this question,这可以作为一些专用解析后粗的实现 - 键将列表中的奇数元素,值将是偶数元素。
- 用户必须能够指定
program_options
未知的选项,就像所有其他选项一样。
很多的选项可供选择:
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等是未知的,您将从解析器中得到一个异常,您可以捕获并处理原始字符串。如果混合使用已知键和未知键,则必须处理每个未知键(将其存储并将其从命令行中除去),然后循环处理其余键直到您没有发生异常为止
啊,没有。用户必须指定这些选项,就像它们是常规程序选项一样。他/她也可以在配置文件中指定它们,'program_options'支持,我当然不希望配置文件看起来像这样。 – einpoklum
您可以定义可多次使用的字符串选项...
(
"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
}
}
你能提供一个你想要做什么的例子(代码或伪代码)吗? – rhashimoto
Boost.ProgramOptions的要点是能够检测用户是否输入了错误的键。你基本上只想要一个程序选项* lexer *,它将选项分解为令牌,你将处理并决定哪些是有效的。 –