我正在寫一些代碼,可以真正做一些簡單的編譯時元編程。使用空結構標籤作爲編譯時間符號是很常見的做法。我需要用一些運行時配置元素來裝飾標籤。靜態變量似乎是唯一的出路(啓用元編程),但靜態變量需要全局聲明。爲了邁出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;
}
編輯: 製造社會的維基。
@Hassan:我注意到剛纔。但是,仍然可以使用更好的標籤:)雖然收回。 – 2010-04-16 10:38:47
這些標籤完全適用於任何尋找此特定問題的人。 – 2010-04-16 10:39:54
但問題是什麼? – 2010-04-16 10:43:52