Wygląda na to, że próbujesz zdefiniować enum Error
, który również ma łańcuchy jako członków. Dam ci własne rozwiązanie tego problemu. (Nie odpowiadam na to pytanie, ale uważam, że moja odpowiedź jest istotna dla tego, co rozumiem, że OP próbuje zrobić.)
I właśnie zdałem sobie sprawę, że OP celuje w C, nie w C++, więc nie jestem pewien, czy to można to zrobić ...
w MyEnum.hpp
#define MYENUM(X,...) \
struct X { \
enum Enum {__VA_ARGS__}; \
static const std::vector<std::string> names; \
static X::Enum which(const std::string& s) { \
return static_cast<X::Enum>(findEnum(s,names)); \
} \
static std::string str(X::Enum i) { \
return names[i];} \
}
Tutaj findEnum()
tylko przeszukiwanie liniowe nad wektorem, który zwraca indeks pozycji (dodatkowo, w mojej realizacji, jeśli nie znajdzie to zgłasza wyjątek z wszystkimi możliwymi poprawnymi danymi wejściowymi, ja też nie rozróżniam wielkości liter). Zauważ, że uporządkowana mapa zamiast wektora byłaby bardziej wydajna (O (log (n)) zamiast O (n)), ale nie obchodziło mnie to zbytnio, ponieważ rozmiar tych rzeczy jest bardzo mały w moim przypadku.
Poniżej poprzedniego makro, zadeklarować enum jako
MYENUM(Error,Connect,Timeout); // I put the semicolon here not in the macro
I MyEnum.cpp
, dodać
#include <boost/assign/list_of.hpp>
const std::vector<std::string> Error::names = boost::assign::list_of
("Connect")("Timeout");
(myślę, że powinno być możliwe użycie list inicjalizacji z nowoczesnym kompilatora).Ważne jest, aby upewnić się, że zamówienie jest takie samo, w przeciwnym razie nie będzie działać.
Następnie można zrobić rzeczy jak to:
Error::Enum err1 = Error::Connect;
Error::Enum err2 = Error::which("Timeout");
std::cout << "Got " << Error::str(err1) << " error. Not good.\n";
Możesz być w stanie to osiągnąć, ale to będzie tak zawiłe, że nie polecam go. Jaki jest twój większy cel? Dlaczego tego chcesz? Wygląda na [Problem XY] (http://meta.stackexchange.com/a/66378). – tenfour
Uważam, że to, co próbujesz zrobić, nie może zostać osiągnięte za pomocą makr. – Codor
Użyj [XMacro] (http://en.wikipedia.org/wiki/X_Macro) –