如何手动向boost::program_options::variables_map插入键值对并更新空输入项
我懂你碰到的这个问题——直接给boost::program_options::variables_map的键赋值字符串或者布尔值肯定行不通,因为它存储的不是原始数据类型,而是boost::program_options::variable_value对象。下面给你两种实用的解决思路:
方法一:手动用variable_value包装值插入
如果你的默认值是动态生成的(没法提前在选项定义里写死),可以先检查目标选项是否在variables_map中存在(也就是命令行有没有输入),不存在的话就把原始值包装成variable_value再赋值:
#include <boost/program_options.hpp> namespace po = boost::program_options; int main(int argc, char* argv[]) { po::options_description desc("Allowed options"); desc.add_options() ("document", po::value<std::string>()) ("flag", po::value<bool>()); po::variables_map args; // 先完成命令行解析流程 po::store(po::parse_command_line(argc, argv, desc), args); po::notify(args); // 给document设置默认值"A"(仅当命令行未输入时) if (!args.count("document")) { // 第二个参数false表示该值不是来自命令行,是手动设置的 args["document"] = po::variable_value(std::string("A"), false); } // 给flag设置默认值true(仅当命令行未输入时) if (!args.count("flag")) { args["flag"] = po::variable_value(true, false); } // 正常使用值 std::cout << "document: " << args["document"].as<std::string>() << std::endl; std::cout << "flag: " << std::boolalpha << args["flag"].as<bool>() << std::endl; return 0; }
这里要注意variable_value的第二个构造参数:设为false表示这个值不是命令行输入的,也不是选项定义里的默认值,只是手动注入的,不会干扰notify()的后续逻辑(如果之前已经调用过notify()的话)。
方法二:定义选项时直接指定默认值(更推荐)
如果你的默认值是固定的,完全可以在定义选项的时候就用->default_value()方法设置,这样命令行没输入时,variables_map会自动填充默认值,不用手动插入:
#include <boost/program_options.hpp> namespace po = boost::program_options; int main(int argc, char* argv[]) { po::options_description desc("Allowed options"); desc.add_options() ("document", po::value<std::string>()->default_value("A")) ("flag", po::value<bool>()->default_value(true)); po::variables_map args; po::store(po::parse_command_line(argc, argv, desc), args); po::notify(args); // 不管命令行有没有输入,直接取值即可 std::cout << "document: " << args["document"].as<std::string>() << std::endl; std::cout << "flag: " << std::boolalpha << args["flag"].as<bool>() << std::endl; return 0; }
这种方式更贴合Boost Program Options的设计理念,代码也更简洁。只有当默认值需要动态计算(比如根据其他逻辑生成)时,再考虑用方法一手动赋值。
内容的提问来源于stack exchange,提问作者etotientz
相关产品推荐
相关产品推荐

