宏使用取决于整数

时间:2009-05-31 22:27:03

标签: c++ opengl macros

我必须在函数内多次使用宏,而需要使用的宏取决于我传入函数的数字。

e.g。

  function(int number) { 
    switch(number) { 
       case 0: doStuff(MACRO0); break; 
       case 1: doStuff(MACRO1); break; 
    } 
  }

问题是:每个switch语句都有很多东西要用同一个宏做。 是否有更优雅的解决方案,然后在switch语句中包含所有内容?就像将宏本身传递给函数一样?我在C ++中已经阅读了类似eval()的方法,但他们对我感觉不对。另一种方法是确定宏扩展的内容,但我没有找到任何关于此的信息。

哦,实际上是openGL。

3 个答案:

答案 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();
}