【问题标题】:Command line argument not stored (using boost)未存储命令行参数(使用 boost)
【发布时间】:2019-05-30 07:30:50
【问题描述】:

我想将命令行值存储到变量中。这是我的完整代码:

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

int main(int argc, char *argv[]) {
  int nselect = 100;
  boost::program_options::options_description desc("Allowed options");
  desc.add_options()
        ("help,h", "print usage message")
        ("nselect,N", boost::program_options::value<int>(&nselect), "number to select");
  boost::program_options::variables_map vm;
  boost::program_options::store(boost::program_options::parse_command_line(argc, argv, desc), vm);

  if (vm.count("help")) {
      std::cout << desc << "\n";
      return 0;
  }
  std::cout<<"nselect = "<<nselect<<"\n";
  return(0);
}

我编译成g++ a.cpp -lboost_program_options,然后运行:

$ ./a.out -N 5
nselect = 100

为什么不存储命令行值?

分辨率

调用notify(vm) 会自动将值存储到变量中指定的变量中。或者可以从 vm 映射它,如下面@Matthieu-Brucher 的回答。

【问题讨论】:

  • 那么,这是 boost::program_options 中的一个错误,它不起作用吗?

标签: c++ boost command-line-arguments boost-program-options


【解决方案1】:

我实际上会为 ProgramOptions 做一些不同的、更惯用的事情:

namespace po = boost::program_options;

po::options_description desc("Options");
desc.add_options()
    ("help,h", "print usage message")
    ("nselect,N", po::value<int>()->default_value(100), "number to select");

po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);

int nselect = vm["nselect"].as<int>();

我没有在您的代码中调用notify,这可能是唯一需要更改的地方,尽管为了便于阅读,我会采用惯用的方式。

【讨论】:

  • 谢谢!这可以工作。只是我必须先在描述中查看所有参数的列表,然后在 vm.xml 中查看。如果我改变一个,我必须改变另一个。也可以使用 value() 函数。
  • 好吧,因为它存储在vm,所以你不需要在其他地方有一个参数列表。我只有一个地方有nselect
  • 实际上,notify(vm) 是我的代码中缺少的内容。添加后即可使用。
  • 这也是我的想法。但仍然不是很地道,因此建议。我见过的所有教程都使用这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-21
  • 1970-01-01
相关资源
最近更新 更多