boost::program_options配置文件中如何设置单空格选项值?
嘿,刚好我对boost::program_options这块折腾过不少,给你分享几个不用手动删引号的可行方案:
最直接的方案:配置文件直接写空格
其实boost::program_options解析配置文件时,默认会把=后面的所有字符(包括空格)作为选项值,直到行尾。所以你只需要在配置文件里这么写:
prefixmiddle=
(注意等号后面跟一个空格再换行)
解析后prefixmiddle的值就是单个空格,完全不需要额外代码处理。我之前做过测试,这种方式是完全生效的。
特殊标记+自定义回调(适合配置文件不允许尾空格的场景)
如果你的配置文件生成规则不允许行尾有空格,可以约定一个特殊标记(比如[SPACE]),然后用notifier回调在解析时替换成空格,代码示例:
#include <boost/program_options.hpp> #include <string> namespace po = boost::program_options; int main() { std::string prefixmiddle_val; po::options_description desc("Config Options"); desc.add_options() ("prefixmiddle", po::value<std::string>(&prefixmiddle_val)->notifier([](std::string& val) { // 把约定的标记替换成单个空格 if (val == "[SPACE]") { val = " "; } }), "Value that needs to be a single space"); po::variables_map vm; po::store(po::parse_config_file("your_config.ini", desc), vm); po::notify(vm); // 此时prefixmiddle_val就是单个空格啦 return 0; }
对应的配置文件写:
prefixmiddle=[SPACE]
全局自定义验证器(更通用的场景)
如果有多个选项需要处理类似特殊值,可以写一个全局的验证器函数,覆盖默认的字符串验证逻辑:
#include <boost/program_options.hpp> #include <string> #include <stdexcept> namespace po = boost::program_options; void validate(boost::any& v, const std::vector<std::string>& values, std::string*, int) { if (values.empty()) { throw po::validation_error(po::validation_error::invalid_option_value); } std::string input = values.front(); // 替换特殊标记为空格 if (input == "[SPACE]") { v = boost::any(std::string(" ")); } else { v = boost::any(input); } } int main() { po::options_description desc("Config Options"); desc.add_options() ("prefixmiddle", po::value<std::string>(), "Value that needs to be a single space"); po::variables_map vm; po::store(po::parse_config_file("your_config.ini", desc), vm); po::notify(vm); auto val = vm["prefixmiddle"].as<std::string>(); return 0; }
内容的提问来源于stack exchange,提问作者val - disappointed in SE
相关产品推荐
相关产品推荐

