【问题标题】:how do I get the non-flag and non-option tokens after boost::program_options parses my command line argsboost::program_options 解析我的命令行参数后如何获取非标志和非选项令牌
【发布时间】:2009-08-22 00:00:57
【问题描述】:

在 python 中,我可以构造我的optparse 实例,这样它会自动将选项和非选项/标志过滤到两个不同的桶中:

(options, args) = parser.parse_args()

使用 boost::program_options,我如何检索作为剩余非选项和非标志令牌的令牌列表?

例如如果我的程序有标志

--foo 
--bar BAR

然后我在命令行中传递:

--foo hey --bar BAR you

我怎样才能得到一个仅由标记“嘿”和“你”组成的列表

【问题讨论】:

  • 重新标记以与其他 boost 库保持一致,并且 boost-program-options 已经存在。
  • Ewwwww,boost 库比 Python 的 :'( 差太多了。我也遇到了这个问题。
  • 我在此向有史以来记录最差的库声明 boost 程序选项(这说明了很多)。

标签: c++ boost boost-program-options


【解决方案1】:

这是一个例子:

namespace po = boost::program_options;    
po::positional_options_description m_positional;
po::options_description m_cmdLine;
po::variables_map m_variables;

m_cmdLine.add_options()
    (/*stuff*/)
    ("input", po::value<vector<string> >()->composing(), "")
;
m_positional.add("input", -1);
po::parsed_options parsed = po::command_line_parser(argc, argv)
                        .options(m_cmdLine)
                        .positional(m_positional)
                        .allow_unregistered()
                        .run();
// store, notify, etc

然后只需将“输入”命名选项作为字符串向量就可以了。

【讨论】:

    【解决方案2】:

    IIRC,您必须使用positional_options_descriptionhidden options 的组合。想法是(1)添加一个普通选项并为其命名,可能类似于--positional=ARG,(2)不要在帮助描述中包含该选项,(3)配置command_line_parser以处理所有位置参数就像指定了 --positional 一样,并且 (4) 使用 vm["positional"].as&lt; std::vector&lt;std::string&gt; &gt;() 检索位置参数。

    在源代码树的某个地方可能有一个示例,但我现在在这台机器上没有它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-14
      • 1970-01-01
      • 1970-01-01
      • 2016-01-11
      • 1970-01-01
      • 2020-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多