kam*_*iro 5 c++ templates metaprogramming
我一直在使用元编程,但有时c宏和模板的组合还不够.
我认为如果元编程平台仅用于Linux等,那么缺点可能是缺乏跨平台兼容性.
所以是的,除了模板之外,现在还有这样的东西吗?谷歌搜索元编程主要是模板元编程,因此现在很难找到..
编辑:这是我一直在做的事情的一个例子.
假设我有一个用于在缓冲区中保存/加载文件的泛型类.我们称之为FilePack.
我有一个定义宏,看起来像
defineFilePack(BaseClass, "code-a")
Run Code Online (Sandbox Code Playgroud)
它基本上创建了一个名为"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
};
Run Code Online (Sandbox Code Playgroud)
现在,FilePack的构造函数实际上是使用全局映射进行的内置检查,即声明的代码与大小匹配.
现在我对如何使用模板元编程难以理解,这实际上非常适合它,因为所有这些文件包代码都在源文件中声明.当然,有人可以在运行时制作自己的FilePack,但除此之外.
元编程可以帮助的另一件事是支持加载不同版本的FilePack.假设我必须更新PersonDetails类.我只是创建一个新类,使用某种元编程来声明继承,并且神奇地使FilePack知道,这样当它加载旧版本的PersonDetails时它可以调用转换函数,或者随你.
此外,欢迎您对该架构发表评论,我很想听到有关它的任何评论,但它可能有点偏离主题?
| 归档时间: |
|
| 查看次数: |
706 次 |
| 最近记录: |