我目前有一个从配置文件加载变量的函数。它使用这些来初始化一组常量配置变量。
// 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
个名称。这也意味着我有几个基本相同的代码副本,可以在不同的项目中维护。
有没有办法使用相同的代码设置不同的常量值来进行读取和解析?也许这样我所要做的就是更改头文件并自动找到这些值配置文件中的名字?棘手的部分是理想情况下面向外部的配置值本身应该是常量的并且在编译时可用(例如,使用字符串到值映射是不可取的,因为我更希望有编译时保护)
答案 0 :(得分:1)
这里的解决方案是不使用全局变量,而是使用一些settings
结构,您可以使用从文件加载的值显式初始化该结构。 struct实例本身并不需要是const(你需要能够将值加载到它中,除非你在构造中传递所有内容),但对它的所有访问都应该是{{1} }。最后一位可以通过传递const
来实现。 <{1}}到任何需要的地方。
settings
当然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
可以保护对其中包含的值的访问。