我一直在使用metaprogramming,但有時候c宏和模板的組合還不夠。除模板之外是否還有任何C++元編程替代方案?
我想缺點將可能是缺乏跨平臺的兼容性,如果元編程平臺是唯一的,比如說,Linux的等
所以呀,有沒有可用的這樣的事情,現在,除了模板?谷歌搜索元編程主要是模板metaprogramming,所以現在很難找到..
編輯:這是我一直在努力的一個例子。
假設我有一個通用類來保存/加載緩衝區中的文件。我們稱之爲FilePack。
我有一個定義的宏,它看起來像
defineFilePack(BaseClass, "code-a")
它基本上創建了一個名爲「BaseClassPack」類,它被定義爲一個子類。下面是那個東西。
class FilePack{
public:
char * thebuffer;
int bufsize;
string packcode;
// and constructors etc
FilePack(const string& thecode, int bufsize);
void operator=(FilePack& rhs);
void saveToFile(const string& filename);
void loadFromFile(const string& filename);
// .. and all the function you'd expect to see in a class like this
};
// the person details
class PersonDetails{
public:
solidstring<64> name;
int age;
DateTime birthday;
// .. yada yada yada
};
defineFilePack(PersonDetails, "psd")
// the above creates the following class
class PersonDetailsPack : public FilePack{
public:
PersonDetailsPack():
FilePack("psd", sizeof(PersonDetails)){ // etc
}
PersonDetails& get(){
return *(PersonDetails*)getBuffer();
}
// and a lot more convenience function
};
現在,實際上是由FilePack的構造一個內置的檢查申報代碼尺寸相匹配,採用了全球地圖。
現在我很難理解如何使用模板元編程,它實際上非常適合它,因爲所有這些filepack代碼都是在源文件中聲明的。當然,有人可能會在運行時創建自己的FilePack,但那不是重點。
元編程可以幫助的另一件事是支持加載不同版本的FilePack。假設我必須更新PersonDetails類。我只是創建一個新類,使用某種元編程來聲明繼承,並且神奇地讓FilePack知道,以便在加載舊版本的PersonDetails時可以調用轉換函數,或者隨你。
此外,歡迎您對該架構發表評論,並且我很樂意聽到關於它的任何評論,但它可能有點偏離主題?
你能提供一個模板+宏不夠的例子嗎?這將是討論的一個好的起點。 – 2011-01-11 20:14:05
@David Rodriguez:例如,生成通過網絡連接序列化類的代碼,或者通常爲每個成員做些事情。 – 6502 2011-01-11 20:15:43
「,但是有時候c宏和模板的組合不夠」 - 什麼是缺失/不夠? – Naveen 2011-01-11 20:15:47