C / C ++宏/模板blackmagic生成唯一的名称 [英] C/C++ macro/template blackmagic to generate unique name
问题描述
宏很好。
模板很好。
几乎任何工作都很好。
例子是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屋!