代码之家  ›  专栏  ›  技术社区  ›  pmr

宏使用取决于整数

  •  1
  • pmr  · 技术社区  · 15 年前

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

    例如

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

    问题是:对于同一个宏,每个switch语句都有很多事情要做。 在switch语句中是否有比这更优雅的解决方案?比如把宏本身传递给函数?我已经阅读了关于C++中类似的方法,但它们对我来说并不合适。另一种方法是确定宏的展开方式,但我没有找到任何关于这个的信息。

    哦,实际上是OpenGL。

    3 回复  |  直到 15 年前
        1
  •  8
  •   Johannes Schaub - litb    15 年前

    我将使用函数对象

    struct Method1 {
        void operator()() { ... }
    };
    
    template<typename Method>
    void function(Method m) {
        ...
        m();
        ...
    }
    
    int main() {
        function(Method1());
    }
    
        2
  •  4
  •   Nikolai Fetissov    15 年前

    这很大程度上取决于 MACRO1 扩展到如果它是一个常量,可以在 switch 或者做多次摔倒。如果它依赖于本地上下文,那么每次都必须对其进行评估。

        3
  •  2
  •   Todd Gardner    15 年前

    除了上面的建议,我经常发现使用虚拟继承可以消除长的条件,特别是切换枚举类型代码。我不确定你的具体情况,所以我不确定他的意愿有多适用,但我们可以说上面是

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