【问题标题】:Macro use depending on integer宏使用取决于整数
【发布时间】:2009-05-31 22:27:03
【问题描述】:

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

例如

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

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

哦,其实是openGL。

【问题讨论】:

    标签: c++ opengl macros


    【解决方案1】:

    我会使用函数对象

    struct Method1 {
        void operator()() { ... }
    };
    
    template<typename Method>
    void function(Method m) {
        ...
        m();
        ...
    }
    
    int main() {
        function(Method1());
    }
    

    【讨论】:

    • 因为使用 op() 的函数对象更快并且可以内联。鉴于他正在做 OpenGL,我认为速度很重要。
    【解决方案2】:

    这在很大程度上取决于 MACRO1 扩展到什么。如果它是一个常数,您可以在 switch 之外调用该函数或执行多个失败案例。如果它取决于本地环境,那么您必须每次都对其进行评估。

    【讨论】:

      【解决方案3】:

      除了上述建议之外,我经常发现使用虚拟继承可以摆脱长条件,尤其是 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();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-31
        • 1970-01-01
        • 1970-01-01
        • 2022-07-11
        • 1970-01-01
        • 2011-01-19
        相关资源
        最近更新 更多