【问题标题】:Can boost::program_options Use A Delimiter Other Than "-"?boost::program_options 可以使用“-”以外的分隔符吗?
【发布时间】:2026-01-25 10:30:01
【问题描述】:

我正在像这样使用 boost::program_options:

namespace po = boost::program_options;
po::options_description desc("Options");
desc.add_options()
  ("help,?", "Show Options")
  ("capture-file,I", po::value<string>(), "Capture File")   
  ("capture-format,F", po::value<string>()->default_value("pcap"), "Capture File Format")
  ("output-file,O", po::value<string>()->default_value("CONOUT$"), "Output File");

po::variables_map vm;
po::store(po::command_line_parser(ac, av).options(desc)./*positional(pd).*/run(), vm);

如果我传递命令行参数 -I hithere 它可以工作,但我传递 /I hithere boost 会抛出一个 boost::bad_any_castwhat() “使用 boost::any_cast 转换失败”。

是否可以使用 program_options 来解析 /-delimitted 或 --delimited 选项?额外的问题,是否可以将其配置为 /- 设置相同的选项,但彼此相反?例如,/verbose 可能意味着详细的日志记录,而-verbose 可能意味着不太详细的日志记录。

【问题讨论】:

    标签: c++ boost-program-options


    【解决方案1】:

    要使用/-,请使用command_line_parserstyle() 方法和style_t 标志的适当组合。例如:

    po::store(po::command_line_parser(ac, av)
        .options(desc)
        .style(po::command_line_style::default_style
            | po::command_line_style::case_insensitive
            | po::command_line_style::allow_slash_for_short
            | po::command_line_style::allow_long_disguise)
        /*.positional(pd)*/
        .run(), vm);
    

    allow_long_disguise/ 开始一个长选项。)

    您可以通过添加自己的additional parser 来使/- 对立;但是,这将是非常不标准的,因此可能会让最终用户感到困惑,所以我不确定这是一个好主意。

    【讨论】:

    • 你可能是对的。是否可以确定调用store 后使用了哪个分隔符?
    • 除非您使用自己的附加解析器,否则我不这么认为。
    • 好的,无论如何,这是一个额外的问题。 :)
    最近更新 更多