Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否有任何c++;除了模板之外的元编程替代方案?_C++_Templates_Metaprogramming - Fatal编程技术网

C++ 是否有任何c++;除了模板之外的元编程替代方案?

C++ 是否有任何c++;除了模板之外的元编程替代方案?,c++,templates,metaprogramming,C++,Templates,Metaprogramming,我一直在使用元编程,但有时c宏和模板的结合是不够的 我认为,如果元编程平台仅适用于(比如)linux等,那么缺点可能是缺乏跨平台兼容性 那么,是的,除了模板,现在还有这样的东西吗?谷歌搜索元编程主要是模板元编程,所以现在很难找到 编辑:下面是我一直在研究的一个例子 假设我有一个通用类,用于将文件保存到缓冲区或从缓冲区加载文件。我们称之为文件包 我有一个define宏,它看起来像 defineFilePack(BaseClass, "code-a") 它基本上创建了一个名为“BaseClas

我一直在使用元编程,但有时c宏和模板的结合是不够的

我认为,如果元编程平台仅适用于(比如)linux等,那么缺点可能是缺乏跨平台兼容性

那么,是的,除了模板,现在还有这样的东西吗?谷歌搜索元编程主要是模板元编程,所以现在很难找到

编辑:下面是我一直在研究的一个例子

假设我有一个通用类,用于将文件保存到缓冲区或从缓冲区加载文件。我们称之为文件包

我有一个define宏,它看起来像

  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

};
类文件包{
公众:
字符*缓冲区;
int bufsize;
字符串packcode;
//施工人员等
文件包(常量字符串和代码,int bufsize);
void运算符=(文件包和rhs);
void saveToFile(常量字符串和文件名);
void loadFromFile(常量字符串和文件名);
//…以及您希望在这样的类中看到的所有函数
};
//此人提供了详细信息
类个人信息{
公众:
solidstring名称;
智力年龄;
日期时间生日;
//....雅达雅达雅达
};
定义标签(个人详细信息,“psd”)
//上面创建了以下类
类PersonDetailsPack:公共文件包{
公众:
PersonDetailsPack():
文件包(“psd”,sizeof(PersonDetails)){//等
}
PersonDetails&get(){
return*(PersonDetails*)getBuffer();
}
//还有更方便的功能
};
现在,FilePack的构造函数使用一个全局映射来检查声明的代码是否与大小匹配

现在我很难理解如何使用模板元编程来实现这一点,因为所有这些文件包代码都是在源文件中声明的,所以模板元编程实际上非常适合。当然,可能有人可以在运行时制作自己的文件包,但这不是重点

元编程在这里可以帮助的另一件事是支持加载不同版本的FilePack。假设我必须更新PersonDetails类。。我只是创建了一个新类,使用某种元编程来声明继承,然后神奇地让FilePack知道,这样当它加载旧版本的PersonDetails时,它就可以调用转换函数,或者其他什么


另外,欢迎您对该体系结构发表评论,我很想听听您对它的任何评论,但这可能有点离题?

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


您可以考虑使用专用预处理器来生成代码作为“元编程”。然后您可以包括诸如lex/yacc和Qt-MOC之类的内容。

我认为这项工作非常适合Python。简单的方法是使用自定义文件格式来描述类是如何生成的,然后您可以生成实现和接口(即使是在多种语言中)

解析复杂的C++语法,解析现有的C++头文件是一种噩梦。(为什么要限制自己表达的内容?)

Python是多平台的,而且本身是一种非常好的语言

下面是一个“扩充”C++的例子……

//
// U8 -> F32 format converter
//
//    - src(Image:U8) ............ source image
//    - dst(pImage:F32:src) ...... destination image
//
ImgFilter u8_to_f32(Image& src, Image& dst)
{
    const double k = 1.0/255;
    for (int y=0; y<src.h; y++)
    {
        unsigned char *rp = src.u8(0, y);
        float *wp = dst.f32(0, y);
        for (int x=0,w=src.w; x<w; x++)
            *wp++ = *rp++ * k;
    }
}
//
//U8->F32格式转换器
//
//-src(图:U8)。。。。。。。。。。。。源图像
//-dst(pImage:F32:src)。。。。。。目的地图像
//
IMG过滤器u8至f32(图像和src、图像和dst)
{
常数双k=1.0/255;

对于语言内部的(int y=0;y,您只能使用模板或宏来进行元编程。例如,Boost预处理器库提供的元编程功能非常强大,它实现了一些真正神奇的宏功能


但是,如果您想获得更多,可以使用您选择的脚本语言进行元编程。

如果您将元编程定义为编写生成代码的代码,那么

  • 模板
  • 预处理器
  • 其他预处理(通常是脚本,但有时是编译器扩展)
  • 从C++代码生成C++源代码,编译为即时,加载为共享LIB。
  • 可能吧,但这是在扩展它,也在生成机器代码,比如蹦床存根

我认为不是模板或C++预处理器最有趣的是支持交叉关注编程的语言扩展,例如,日志记录方法调用或序列化。 我记得那个地方做了一个工具

嗯,这提醒我不要忘了什么时候去看看。:-)


Cheers&hth.,

如果您想对代码执行任意操作,您需要一个通用元编程工具,如程序转换系统。这些工具接受源代码,并使用类似编译器的技术根据您的需要对代码执行任意分析/修改

我们的系统正是这样一个系统。它通过对要处理的编程语言的显式描述,以及您希望它在源代码上执行的任务来参数化。DMS的独特之处在于它是这样一个通用的系统(Jackpot是一个纯Java的程序转换系统)并且具有独特的鲁棒性,它已经被用于生产C++系统的大规模转换任务。

前端,DMS可以将源代码解析为抽象语法树,生成符号表,使用C++中直接写入的模式执行模式匹配或代码转换,并用注释和原始文本格式(包括数基数等)重新生成可编译源代码。.您的程序修改可以是您可以在ASTs上定义的任何计算。简而言之,它可以