我已经使用了很多元编程,但是有时c宏和模板的组合仅仅是不够的。
我认为,如果元编程平台仅用于linux等,则缺点可能是缺乏跨平台兼容性。
是的,除了模板之外,现在还有其他可用的东西吗? Google搜索元编程主要由模板元编程主导,因此现在很难找到。
编辑:这是我一直在努力的示例。
假设我有一个通用类,用于将文件保存到缓冲区中或从缓冲区中加载文件。我们称它为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。假设我必须更新PersonDetails类。我只是创建一个新类,使用某种元编程来声明继承,并神奇地使FilePack知道,以便在加载旧版本的PersonDetails时可以调用转换函数,或者任何。
另外,也欢迎您对此体系结构发表评论,并且我很想听听有关该体系结构的任何评论,但这可能有点不合时宜吗?
最佳答案
您也可以使用预处理器进行元编程。
您也可以考虑使用专用预处理器来生成代码作为“元编程”。然后,您可以包括lex/yacc和Qt MOC之类的东西。
关于c++ - 除了模板,还有其他c++元编程替代方法吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4662112/