代码之家  ›  专栏  ›  技术社区  ›  Fantastic Mr Fox

Boost程序参数可以解析wstring,但会将其强制为字符串?

  •  4
  • Fantastic Mr Fox  · 技术社区  · 8 年前

    我正在使用 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二进制'>>':未找到接受类型为“std::basic\u istream>”的左操作数的运算符(或没有可接受的转换)

    从 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信息。不确定这个转换的结果是什么,或者是如何完成的。

    1 回复  |  直到 8 年前
        1
  •  4
  •   sehe    8 年前

    你需要两件事:

    • 使用 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词法转换)