C / C ++宏/模板blackmagic生成唯一的名称 [英] C/C++ macro/template blackmagic to generate unique name

查看:212
本文介绍了C / C ++宏/模板blackmagic生成唯一的名称的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

宏很好。
模板很好。
几乎任何工作都很好。



例子是OpenGL;但是技术是C ++特定的并且依赖于没有OpenGL的知识。



精确的问题:



表达式E;其中我不必指定唯一的名称;使得构造函数被调用,其中E被定义,并且调用析构函数,其中块E在结束。



例如,考虑:

  class GlTranslate {
GLTranslate(float x,float y,float z); {
glPushMatrix();
glTranslatef(x,y,z);
}
〜GlTranslate(){glPopMatrix(); }
};

手动解决方案:

  {
GlTranslate foo(1.0,0.0,0.0); //我不得不给它一个名字
.....
} // auto popmatrix


b $ b

现在,我不仅有glTranslate,但很多其他PushAttrib / PopAttrib调用。我宁愿不必为每个var提供一个唯一的名称。有一些涉及宏模板的技巧...或者其他会自动创建一个变量的人的构造函数在定义点被调用;

解决方案

如果你的编译器支持 __ COUNTER __ (可能是这样),你可以尝试:

 <$ c $ (x,y)
#define MAKE_UNIQUE(x)y
#define CONCATENATE_DETAIL(x,y) CONCATENATE(x,__COUNTER__)

//每转换类型
#define GL_TRANSLATE_DETAIL(n,x,y,z)GlTranslate n(x,y,z)
#定义GL_TRANSLATE(x,y,z)GL_TRANSLATE_DETAIL(MAKE_UNIQUE(_trans_),x,y,z)

For

  {
GL_TRANSLATE(1.0,0.0,0.0);

//变成这样:
GlTranslate _trans_1(1.0,0.0,0.0);

} // auto popmatrix


Macros are fine. Templates are fine. Pretty much whatever it works is fine.

The example is OpenGL; but the technique is C++ specific and relies on no knowledge of OpenGL.

Precise problem:

I want an expression E; where I do not have to specify a unique name; such that a constructor is called where E is defined, and a destructor is called where the block E is in ends.

For example, consider:

class GlTranslate {
  GLTranslate(float x, float y, float z); {
    glPushMatrix();
    glTranslatef(x, y, z);
  }
  ~GlTranslate() { glPopMatrix(); }
};

Manual solution:

{
  GlTranslate foo(1.0, 0.0, 0.0); // I had to give it a name
  .....
} // auto popmatrix

Now, I have this not only for glTranslate, but lots of other PushAttrib/PopAttrib calls too. I would prefer not to have to come up with a unique name for each var. Is there some trick involving macros templates ... or something else that will automatically create a variable who's constructor is called at point of definition; and destructor called at end of block?

Thanks!

解决方案

If your compiler supports __COUNTER__ (it probably does), you could try:

// boiler-plate
#define CONCATENATE_DETAIL(x, y) x##y
#define CONCATENATE(x, y) CONCATENATE_DETAIL(x, y)
#define MAKE_UNIQUE(x) CONCATENATE(x, __COUNTER__)

// per-transform type
#define GL_TRANSLATE_DETAIL(n, x, y, z) GlTranslate n(x, y, z)
#define GL_TRANSLATE(x, y, z) GL_TRANSLATE_DETAIL(MAKE_UNIQUE(_trans_), x, y, z)

For

{
    GL_TRANSLATE(1.0, 0.0, 0.0);

    // becomes something like:
    GlTranslate _trans_1(1.0, 0.0, 0.0);

} // auto popmatrix

这篇关于C / C ++宏/模板blackmagic生成唯一的名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆