Boost程序参数可以解析一个wstring,但强制它成为一个字符串?

时间:2017-12-14 06:09:54

标签: c++ boost

我使用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 wstrings。但boost专门为宽字符串命令行参数解析提供wcommand_line_parser(注意w)。但是看起来没有办法将该参数结果实际检索为宽字符串。

是否有解决方法或我做错了什么?

注意:可以使用此更改编译代码:

desc.add_options()
("silent", po::value<std::string>()->default_value("yes"), "Select the verbosity")

但是你会丢失字符串中的unicode信息。不确定此转换的确切结果或完成方式。

1 个答案:

答案 0 :(得分:2)

你需要两件事:

  • 使用wvalue
  • 提供默认值的窄字符文本表示形式,以便在用法说明文本中使用。

    请注意,您引用了add_options行中的错误。问题是添加选项描述,而不是解析它。

    原因是选项描述总是char - 基于(您知道这一点,因为描述和选项名称也很窄)。获取默认值的文本表示时,Boost PO会尝试使用ostream运算符¹,但这对您的wchar_t const*std::wstring值不起作用。

    非流式自定义选项类型也是如此,因此您可以手动传递文本表示(例如default_value(std::vector<int>{1,2,3}, "1-3")以获取解析范围的多值选项。)

样本

你得到:

查看 Live On Coliru

#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)