除了模板之外还有其他c ++元编程方案吗?

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时它可以调用转换函数,或者随你.

此外,欢迎您对该架构发表评论,我很想听到有关它的任何评论,但它可能有点偏离主题?

Edw*_*nge 5

您还可以使用预处理器进行元编程.

您可以考虑使用专用预处理器来生成代码作为"元编程".然后你可以包括像lex/yacc和Qt MOC这样的东西.