您可以使用extra_parser
(see 非常规语法 https://www.boost.org/doc/libs/1_73_0/doc/html/program_options/howto.html#id-1.3.31.6.3在文档中),即解析器可用于在进一步处理输入之前操纵输入中的标记。它可以用于诸如翻译之类的事情--run
into --command=run
etc.
额外的解析器是一个具有以下签名的函子:
std::pair<std::string, std::string>(const std::string &s)
它应该返回选项名称pair::first
和(可选)选项值pair::second
. Empty pair::first
意味着额外的解析器还没有解析任何东西。值(即pair::second
) 可以为空 - 仅解析选项名称。如果返回的对有效,则使用名称或名称/值对,而不是通过正常机器解析原始标记。
首先,我们编写别名函数:
using OptionAliases = std::map<std::string, std::string>;
std::pair<std::string, std::string>
renameOptions(const std::string &token, const OptionAliases &aliases)
{
auto rtoken(boost::make_iterator_range(token));
// consume "--" prefix
if (!boost::algorithm::starts_with(rtoken, "--")) { return { "", "" }; }
rtoken.advance_begin(2);
// find equal sign (returns iterator range)
const auto eq(boost::algorithm::find_first(rtoken, "="));
// extract option (between "--prefix" and "="/end()) and map it to output
const auto faliases(aliases.find(std::string(rtoken.begin(), eq.begin())));
if (faliases == aliases.end()) { return { "", "" }; }
// return remapped option and (optionally) value after "="
return std::make_pair(faliases->second
, std::string(eq.end(), rtoken.end()));
}
它只是将输入令牌分成--
, name
, =
, value
(如果没有则没有价值=
符号),如果在提供的别名映射中找到该名称,则返回(remapped-name, value)
.
然后,我们使用 lambda 创建解析器本身:
boost::program_options::ext_parser optionAlias(OptionAliases &&aliases)
{
return [aliases{std::move(aliases)}](const std::string &token)
{
return renameOptions(token, aliases);
};
}
(至少需要 C++14,对于 C++11 更改为return [aliases](con...
)
您可以将此解析器插入到 cmdline 解析器中:
parser.extra_parser(optionAlias({{"mark.twain", "samuel.clemens"}
, {"lewis.caroll", "charles.dodgson"}}));
现在,在上面的例子中,两者--mark.twain
and --samuel.clemens
将指向vars["samuel.clemens"]
以及两者--lewis.caroll
and --charles.dodgson
将指向vars["charles.dodgson"]
.
Caveats:
希望能帮助到你。