【问题标题】:Why boost::program_options::bool_switch is not behaving like I expect?为什么 boost::program_options::bool_switch 的行为不像我预期的那样?
【发布时间】:2017-01-20 01:24:42
【问题描述】:

下面的代码使用po::bool_switch(&flag),希望自动将正确的值分配给flag

我的编译命令是clang++ -std=c++11 test.cpp -o test -lboost_program_options

所以我用./test -h 运行程序,它没有显示任何帮助消息。

为什么会这样?

#include <iostream>
#include <boost/program_options.hpp>

namespace
{
  namespace po = boost::program_options;
}

int main(int ac, char ** av)
{
  bool flag;

  po::options_description help("Help options");

  help.add_options()
    ( "help,h"
    , po::bool_switch(&flag)->default_value(false)
    , "produce this help message" );

  po::variables_map vm;

  po::parsed_options parsed
    = po::parse_command_line(ac,av,help);

  po::store(po::parse_command_line(ac,av,help),vm);

  if (flag)
  {
    std::cout << help;
  }
  po::notify(vm);

  return 0;
}

【问题讨论】:

  • notify 不负责将值存储到变量中吗?如果在if (flag) 之前,您可以移动一下,看看它是否能纠正这种行为?
  • 是的,那是我的错。非常感谢
  • 我已经通过文档链接将其作为答案。

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


【解决方案1】:

您应该在解析和存储参数后调用notifystore 只是填写variables_map 的内部数据结构。 notify 发布它们。

您的示例与tutorial 中“入门部分”中的示例几乎完全相同。

here 他们给出了一个非常大胆的警告,不要忘记它:

最后,对通知函数的调用会运行用户指定的通知函数并将值存储到常规变量中(如果需要)。

警告: 存储完所有解析值后不要忘记调用 notify 函数。

这应该可行:

po::variables_map vm;
po::parsed_options parsed
  = po::parse_command_line(ac,av,help);
po::store(po::parse_command_line(ac,av,help),vm);
po::notify(vm); // call after last store, and before accesing parsed variables

if (flag)
{
  std::cout << help;
}

【讨论】:

  • 我找到了将通知放在if (flag) 之后的原因。由于其他选项...如果用户未提供其他所需选项,则通知将抛出。即使提供了help-flag。这是一个用例,我的示例没有显示 X-/ 但无论如何,我的示例/问题已由您的答案解决,所以我标记它。
猜你喜欢
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 2019-01-14
  • 2020-03-11
  • 2016-01-28
  • 2018-12-15
  • 1970-01-01
  • 2017-04-11
相关资源
最近更新 更多