给定以下程序
#include <boost/program_options.hpp>
#include <boost/shared_ptr.hpp>
#include <iostream>
using namespace std;
namespace po = boost::program_options;
int main(int argc, const char *argv[]) {
try {
po::options_description global("Global options");
global.add_options()
("x", po::value<int>()->required(), "The required x value");
po::variables_map args;
// shouldn't this throw an exception, when --x is not given?
po::store(po::parse_command_line(argc, argv, global), args);
// throws bad_any_cast
cout << "x=" << args["x"].as<int>() << endl;
} catch (const po::error& e) {
std::cerr << e.what() << endl;
}
cin.ignore();
return 0;
}
X 是必需的,但给定一个空命令行parse_command_line
不会引发异常。所以当我通过args["x"]
访问x
时,它会崩溃。我反而得到了bad_any_cast
。
调用boost::program_options::store
顾名思义,只将第一个参数(这是一个boost::program_options::basic_parsed_options
)的选项存储在作为第二个参数传递的映射中。若要运行所需的检查并获取预期的异常,还必须显式调用boost::program_options::notify
:
po::store(po::parse_command_line(argc, argv, global), args);
po::notify(args);