Real-world use of X-Macros

前端 未结 7 1207
花落未央
花落未央 2020-11-22 12:21

I just learned of X-Macros. What real-world uses of X-Macros have you seen? When are they the right tool for the job?

7条回答
  •  长情又很酷
    2020-11-22 12:42

    I like to use X macros for creating 'rich enumerations' which support iterating the enum values as well as getting the string representation for each enum value:

    #define MOUSE_BUTTONS \
    X(LeftButton, 1)   \
    X(MiddleButton, 2) \
    X(RightButton, 4)
    
    struct MouseButton {
      enum Value {
        None = 0
    #define X(name, value) ,name = value
    MOUSE_BUTTONS
    #undef X
      };
    
      static const int *values() {
        static const int a[] = {
          None,
    #define X(name, value) name,
        MOUSE_BUTTONS
    #undef X
          -1
        };
        return a;
      }
    
      static const char *valueAsString( Value v ) {
    #define X(name, value) static const char str_##name[] = #name;
    MOUSE_BUTTONS
    #undef X
        switch ( v ) {
          case None: return "None";
    #define X(name, value) case name: return str_##name;
    MOUSE_BUTTONS
    #undef X
        }
        return 0;
      }
    };
    

    This not only defines a MouseButton::Value enum, it also lets me do things like

    // Print names of all supported mouse buttons
    for ( const int *mb = MouseButton::values(); *mb != -1; ++mb ) {
        std::cout << MouseButton::valueAsString( (MouseButton::Value)*mb ) << "\n";
    }
    

提交回复
热议问题