L
Hallo,
ich hab den Vorschlag mal zu folgendem Ergebnis eingedampft:
// .h
template<typename T> class JPEnum
{
public:
static char const* namen[];
static T werte[];
JPEnum(const T& TValue);
JPEnum(char* lpszValue);
~JPEnum();
BOOL IsValid();
operator const char*();
T& operator=(char* lpszValue);
private:
T m_TValue;
};
enum Farbe
{
ROT = 2,
GRUEN = 3,
BLAU = 5,
GELB = 7
};
char const* JPEnum<Farbe>::namen[]={"ROT","GRUEN","BLAU","GELB",NULL};
Farbe JPEnum<Farbe>::werte[]={ROT, GRUEN, BLAU, GELB};
enum Land
{
ENGLAND = 10,
DEUTSCHLAND = 20,
USA = 30
};
char const* JPEnum<Land> ::namen[]={"ENGLAND","DEUTSCHLAND","USA",NULL};
Land JPEnum<Land> ::werte[]={ENGLAND,DEUTSCHLAND,USA};
// .cpp
template<typename T> JPEnum<T>::JPEnum(const T& TValue) : m_TValue(TValue) {}
template<typename T> JPEnum<T>::JPEnum(char* lpszValue) : m_TValue((T)-1)
{
for(int intIndex = 0 ; namen[intIndex] != NULL ; intIndex++)
{
if(!_stricmp(lpszValue, namen[intIndex]))
{
this->m_TValue = werte[intIndex];
return;
}
}
}
template<typename T> JPEnum<T>::~JPEnum() { }
template<typename T> JPEnum<T>::operator const char*()
{
for(int intIndex = 0 ; namen[intIndex] != NULL ; intIndex++)
{
if(m_TValue == werte[intIndex])
{
return namen[intIndex];
}
}
return NULL;
};
// ======================================================================
template<typename T> T& JPEnum<T>::operator=(char* lpszValue)
{
for(int intIndex = 0 ; namen[intIndex] != NULL ; intIndex++)
{
if(!_stricmp(lpszValue, namen[intIndex]))
{
this->m_TValue = werte[intIndex];
return this->m_TValue;
}
}
this->m_TValue = (T)-1;
return this->m_TValue;
};
template<typename T> BOOL JPEnum<T>::IsValid()
{
return (this->m_TValue != (T)-1);
}
void Test()
{
// Land
JPEnum<Land> l = DEUTSCHLAND;
const char* lpszLand = (const char*) l;
// Farbe
JPEnum<Farbe> f1 = "BLAU";
JPEnum<Farbe> f2("Nix");
f2 = "Gruen";
f2 = f1;
const char* lpszFarbe = (const char*) f2;
}
Das ist zwar nicht exakt das gewünschte Ergebnis, reicht aber aus und hilft mir weiter.
Optimiert ist ebenfalls noch nicht, die public member müssen noch privatisiert und mit get/set methoden versehen werden.
Gestolpert bin ich übrigens bei folgender Zeile:
JPEnum<Farbe> f1 = "BLAU";
Hier hatte ich einen Aufruf von operator= erwartet, bis ich endlich darauf kam dass hier der constructor aufgerufen wird
Vielen Dank für eure Vorschläge, die Idee mit der Überladung von operator<< fand ich ebenfalls interessant.
Gruß
Laerdris