代码之家  ›  专栏  ›  技术社区  ›  highBandWidth

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

  •  0
  • highBandWidth  · 技术社区  · 7 年前

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

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   Matthieu Brucher    7 年前

    实际上,我会为程序选项做一些不同的、更惯用的事情:

    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 调用您的代码,这可能是唯一需要更改的事情,尽管为了可读性,我选择了惯用的方法。