c ++: Использование X Macro для определения перечислимого и строкового массива внутри класса? - PullRequest
0 голосов
/ 09 сентября 2011

Использование C ++ (Visual Studio). Я пытаюсь найти решение для преобразования перечисления в строку. Я столкнулся с X Macros (http://drdobbs.com/cpp/184401387), который кажется разумным решением, но мне трудно заставить его работать внутри класса. Все примеры, которые я видел, показывают все, что определено вне класса .

// ColorNames.h
X(Red, "Red"),
X(Blue, "Blue"),
...


// MyClass.h
class MyClass
{
public:
    MyClass();
    virtual ~MyClass();

    #define X(a, b) a
    enum Colors {
        #include "ColorNames.h"
    };
    #undef X

    #define X(a, b) b
    char *colorNameStrings_[] = {
        #include "ColorNames.h"
    };
    #undef X
}

IDE задыхается в строке *colorNameStrings_[] =... Я полагаю, вы не можете инициализировать переменную-член данных в заголовочном файле? Как мне заставить это работать?

Ответы [ 3 ]

2 голосов
/ 09 сентября 2011

Вместо использования X-макросов рассмотрите возможность использования библиотеки Boost.Preprocessor . Первоначальное, одноразовое определение макросов генерации кода требует немного работы, но конечный результат намного чище и намного проще для повторного использования.

В ответ на «Как преобразовать переменную типа enum в строку?» Я предоставил базовую реализацию универсального преобразования перечисления в строку в Boost.Preprocessor?

2 голосов
/ 09 сентября 2011

Проблема в том, что вы не можете инициализировать нестатическую константу внутри определения класса.

Возможно, вам придется сделать это так:

// MyClass.h
class MyClass
{
public:
    MyClass();
    virtual ~MyClass();

    #define X(a, b) a
    enum Colors {
        #include "ColorNames.h"
    };
    #undef X

    static const char * colorNameStrings_[];
};

И в.файл cpp:

// MyClass.cpp
#include "MyClass.h"

#define X(a, b) b
const char * MyClass::colorNameStrings_[] = {
    #include "ColorNames.h"
};
#undef X
1 голос
/ 09 сентября 2011

Используйте такую ​​структуру как

struct convert
{
     std::map<MyEnum, std::string> mapping;

     convert() 
     { 
          mapping[SOME_ENUM_VALUE] = "SomeValue"; 
          // etc to fill map
     }

     std::string operator()(MyEnum enum)
     {
         return mapping[enum];    
     }

};

Затем используйте как это:

convert c;
std::string ret = c(myenum);  //calls operator()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...