gpt4 book ai didi

c++ - 使用 boost::program_options 解析配置文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:11:08 34 4
gpt4 key购买 nike

你好,

我写了一个类来通过 boost::program_options 解析配置文件。这是我的(缩短):

namespace nsProOp = boost::program_options;
nsProOp::variables_map m_variableMap;
nsProOp::options_description m_description;



// To add options to the variableMap, e.g. "addOption<int>("money_amount");"
template <class T>
void addOption(const std::string& option, const std::string& helpDescription = "") {
m_description.add_options()(option.c_str(), nsProOp::value<T > (), helpDescription.c_str());
}



// And this is how i actually read the file:
void ConfigFile::parse() {
std::ifstream file;
file.open(m_pathToFile.c_str());

nsProOp::store(nsProOp::parse_config_file(file, m_description, true), m_variableMap);
nsProOp::notify(m_variableMap);
}

好的,这很好用。但我希望能够再次解析同一个文件,以便我始终使用用户提供的最新条目! boost 文档说的是“store”:

"Stores in 'm' all options that are defined in 'options'. If 'm' already has a non-defaulted value of an option, that value is not changed, even if 'options' specify some value."

因此,如果我再次调用“parse()”,什么也不会发生,因为 m_variableMap 已填充。我尝试调用 m_variableMap.clear() 并没有解决我的问题,因此存储只在第一次起作用。

有人对我有什么建议吗?如果我的问题不清楚,请告诉我。谢谢!

最佳答案

至少在 boost 1.50 中,variables_map::clear() 将允许通过 store 正确地重新填充变量映射。至少可以追溯到 boost 1.37 的替代解决方案是在调用 store 之前将默认构造的变量映射分配给变量映射。

void ConfigFile::parse() {
std::ifstream file;
file.open(m_pathToFile.c_str());
m_variableMap = nsProOp::variables_map(); // Clear m_variableMap.
nsProOp::store(nsProOp::parse_config_file(file, m_description, true),
m_variableMap);
nsProOp::notify(m_variableMap);
}

这是一个示例程序:

#include <boost/program_options.hpp>
#include <iostream>
#include <fstream>
#include <string>

namespace po = boost::program_options;

void write_settings(const char* value)
{
std::ofstream settings_file("settings.ini");
settings_file << "name = " << value;
}

void read_settings(po::options_description& desc,
po::variables_map& vm)
{
std::ifstream settings_file("settings.ini");

// Clear the map.
vm = po::variables_map();

po::store(po::parse_config_file(settings_file , desc), vm);
po::notify(vm);
}

int main()
{
std::string name;

// Setup options.
po::options_description desc("Options");
desc.add_options()
("name", po::value<std::string>(&name), "name");
po::variables_map vm;

// Write, read, and print settings.
write_settings("test");
read_settings(desc, vm);
std::cout << "name = " << name << std::endl;

// Write, read, and print newer settings.
write_settings("another test");
read_settings(desc, vm);
std::cout << "name = " << name << std::endl;
}

产生以下输出:

name = testname = another test

关于c++ - 使用 boost::program_options 解析配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11451549/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com