我必须在函数内多次使用宏,而需要使用的宏取决于我传入函数的数字。
e.g。
function(int number) {
switch(number) {
case 0: doStuff(MACRO0); break;
case 1: doStuff(MACRO1); break;
}
}
问题是:每个switch语句都有很多东西要用同一个宏做。 是否有更优雅的解决方案,然后在switch语句中包含所有内容?就像将宏本身传递给函数一样?我在C ++中已经阅读了类似eval()的方法,但他们对我感觉不对。另一种方法是确定宏扩展的内容,但我没有找到任何关于此的信息。
哦,实际上是openGL。
答案 0 :(得分:8)
我会使用函数对象
struct Method1 {
void operator()() { ... }
};
template<typename Method>
void function(Method m) {
...
m();
...
}
int main() {
function(Method1());
}
答案 1 :(得分:4)
这在很大程度上取决于MACRO1
扩展到的内容。如果它是一个常数,你只需调用switch
之外的函数或执行多个直通案例。如果它取决于当地情况,那么您每次都必须对其进行评估。
答案 2 :(得分:2)
除了上面的建议,我经常发现使用虚拟继承可以摆脱长条件,特别是switch-over-enums类型的代码。我不确定你的具体情况,所以我不确定他的意愿有多适用,但让我们说以上是
enum StyleID { STYLE0 = 0, STYLE1, STYLE2 /* ... */ };
void drawStyle(StyleID id) {
switch(id) {
case STYLE1: doDraw(MACROSTYLE1); break;
/* ... */
};
}
可以通过虚拟继承避免长块交换机:
class StyleInterface {
/* some methods */
virtual void doDraw() = 0;
};
class Style1 : public StyleInterface {
/* concrete impl */
virtual void doDraw() { doDraw(MACROSTYLE1); }
};
void drawStyle(StyleInterface* id) {
id->doDraw();
}