我使用boost::program_options
使用宽字符串解析命令行参数。我有以下代码:
namespace po = boost::program_options;
po::options_description desc("Allowed options");
desc.add_options()
("silent", po::value<std::wstring>()->default_value(L"yes"), "Select the verbosity")
po::variables_map vm;
po::wcommand_line_parser parser(args);
po::wparsed_options parsedOptions = parser.options(desc).style(1).run();
po::store(parsedOptions, vm);
po::notify(vm);
但我得到错误:
错误C2678二进制'&gt;&gt;':找不到带有'std :: basic_istream&gt;'类型左手操作数的运算符(或者没有可接受的转换)
来自add_options
功能线。我理解operator>>
和operator<<
don't work with wstring
s。但boost
专门为宽字符串命令行参数解析提供wcommand_line_parser
(注意w)。但是看起来没有办法将该参数结果实际检索为宽字符串。
是否有解决方法或我做错了什么?
注意:可以使用此更改编译代码:
desc.add_options()
("silent", po::value<std::string>()->default_value("yes"), "Select the verbosity")
但是你会丢失字符串中的unicode信息。不确定此转换的确切结果或完成方式。
答案 0 :(得分:2)
你需要两件事:
wvalue
提供默认值的窄字符文本表示形式,以便在用法说明文本中使用。
请注意,您引用了add_options
行中的错误。问题是添加选项描述,而不是解析它。
原因是选项描述总是char
- 基于(您知道这一点,因为描述和选项名称也很窄)。获取默认值的文本表示时,Boost PO会尝试使用ostream
运算符¹,但这对您的wchar_t const*
或std::wstring
值不起作用。
非流式自定义选项类型也是如此,因此您可以手动传递文本表示(例如default_value(std::vector<int>{1,2,3}, "1-3")
以获取解析范围的多值选项。)
你得到:
#include <boost/program_options.hpp>
namespace po = boost::program_options;
int main() {
po::options_description desc("Allowed options");
desc.add_options()
("silent", po::wvalue<std::wstring>()->default_value(L"yes", "yes"), "Select the verbosity")
;
po::variables_map vm;
std::vector<std::wstring> args { L"--silent=no" };
po::wcommand_line_parser parser(args);
po::wparsed_options parsedOptions = parser.options(desc).style(po::command_line_style::default_style).run();
po::store(parsedOptions, vm);
po::notify(vm);
}
注
在此特定示例中,您可能需要
po::bool_switch()
而不是po::xvalue()
¹(最终,通过Boost Lexical Cast)