我正在编写一些代码,这些代码实际上可以用于一些简单的编译时元编程。通常的做法是使用空结构标记作为编译时符号。我需要用一些运行时配置元素来装饰标签。静态变量似乎是唯一的方法(启用元编程),但是静态变量需要全局声明。绕过这个 Scott Myers 的建议(来自 Effective C++ 的第三版),关于通过在函数中声明静态变量而不是作为类变量来对静态变量的初始化进行排序,我想到了。
所以我想出了下面的代码,我的假设是它会让我有一个编译时符号和在运行时可用的字符串文字。我没有遗漏任何我希望的东西,并且只要我在初始化依赖的模板类之前填充运行时字段,这将正常工作?.
#include <string>
template<class Instance>
class TheBestThing {
public:
static void set_name(const char * name_in) {
get_name() = std::string(name_in);
}
static void set_fs_location(const char * fs_location_in) {
get_fs_location() = std::string(fs_location_in);
}
static std::string & get_fs_location() {
static std::string fs_location;
return fs_location;
}
static std::string & get_name() {
static std::string name;
return name;
}
};
struct tag {};
typedef TheBestThing<tag> tbt;
int main()
{
tbt::set_name("xyz");
tbt::set_fs_location("/etc/lala");
ImportantObject<tbt> SinceSlicedBread;
}
编辑: 制作社区维基。