命令行参数未存储(使用 boost)

Command line argument not stored (using boost)

本文关键字:使用 boost 存储 参数 命令行      更新时间:2023-10-16

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

#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 的答案。

我实际上会为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,这可能是唯一要更改的内容,尽管为了可读性,我会选择惯用的方式。