如何从 C++ 中的配置文件加载自定义 "const" 变量?
How do I load custom "const" variables from a config file in C++?
我目前有一个从配置文件加载变量的函数。它使用这些来初始化一组常量配置变量。
// header file
namespace cfg {
extern const char *config_value;
}
// source file
namespace cfg {
const char *config_value;
}
bool load_config() {
cfg::config_value = load_config_line("config_value");
}
const char *load_config_line(const char *key) {
// read value from config.cfg...
}
这个效果很好。问题是现在我想在其他几个项目中重用这段代码,这意味着常量值必须改变。这意味着在代码中的四个不同位置分别更改 config_value
名称。这也意味着我有几份基本相同的代码要在不同的项目中维护。
有没有一种方法可以使用相同的代码来设置不同的常量值集来读取和解析?也许这样我所要做的就是更改头文件和它会自动在配置文件中找到那些值名称?棘手的部分是,理想情况下 面向外的配置值本身应该是常量并且在编译时可用 (例如,使用字符串到值映射是不可取的,因为我更希望编译时间保护)。
这里的解决方案是不使用全局变量,而是使用一些 settings
结构,您可以使用从文件加载的值显式初始化这些结构。 struct 实例本身不需要是 const(你需要能够将值加载到其中,除非你在构造时传递所有内容),但对它的所有访问都应该是 const
。最后一点可以通过传递 settings
来实现,例如a const settings&
到需要的地方。
int main()
{
// Variant A: 2-step init
settings s;
s.loadConfigFile(filename);
// Variant B: 1-step init - can make instance itself const
const settings s(filename);
Thing worker(s); // Thing::Thing(const settings&)
worker.work();
}
当然 Worker
可以随心所欲。
请注意,设置本身不需要任何特殊的常量:
struct settings
{
std::string config_value;
}
它是外部 const
保护对其中包含的值的访问。
我目前有一个从配置文件加载变量的函数。它使用这些来初始化一组常量配置变量。
// header file
namespace cfg {
extern const char *config_value;
}
// source file
namespace cfg {
const char *config_value;
}
bool load_config() {
cfg::config_value = load_config_line("config_value");
}
const char *load_config_line(const char *key) {
// read value from config.cfg...
}
这个效果很好。问题是现在我想在其他几个项目中重用这段代码,这意味着常量值必须改变。这意味着在代码中的四个不同位置分别更改 config_value
名称。这也意味着我有几份基本相同的代码要在不同的项目中维护。
有没有一种方法可以使用相同的代码来设置不同的常量值集来读取和解析?也许这样我所要做的就是更改头文件和它会自动在配置文件中找到那些值名称?棘手的部分是,理想情况下 面向外的配置值本身应该是常量并且在编译时可用 (例如,使用字符串到值映射是不可取的,因为我更希望编译时间保护)。
这里的解决方案是不使用全局变量,而是使用一些 settings
结构,您可以使用从文件加载的值显式初始化这些结构。 struct 实例本身不需要是 const(你需要能够将值加载到其中,除非你在构造时传递所有内容),但对它的所有访问都应该是 const
。最后一点可以通过传递 settings
来实现,例如a const settings&
到需要的地方。
int main()
{
// Variant A: 2-step init
settings s;
s.loadConfigFile(filename);
// Variant B: 1-step init - can make instance itself const
const settings s(filename);
Thing worker(s); // Thing::Thing(const settings&)
worker.work();
}
当然 Worker
可以随心所欲。
请注意,设置本身不需要任何特殊的常量:
struct settings
{
std::string config_value;
}
它是外部 const
保护对其中包含的值的访问。