未存储命令行参数(使用 boost)
Command line argument not stored (using boost)
我想将命令行值存储到变量中。这是我的完整代码:
#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
,这可能是唯一需要更改的地方,尽管为了提高可读性,我会采用惯用的方式。
我想将命令行值存储到变量中。这是我的完整代码:
#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
,这可能是唯一需要更改的地方,尽管为了提高可读性,我会采用惯用的方式。