Silpion
2007-02-14, 14:42:50
Hallo,
ich habe ein kleines Problem, für dass ich noch keine vernünftige Lösung gefunden habe:
Ich habe eine Klasse
template <class T>
class Foo
{
...
};
die sehr viele Funktionen für alle T enthält. Nun möchte ich noch eine (statische) Funktion hinzufügen, die für ein dutzend T etwas leicht anderes macht. Normale Template-Spezialisierung mit z.B.
template <>
class Foo<int>
{
...
};
führt dazu, dass ich die komplette Klasse naherzu identisch neu definieren muss, was Wartung des Codes extrem unhandlich werden lässt, vor allem für die anderen Projektmitarbeiter, die sich das nicht ausgedacht haben. Eine spezialisierte Template-Funktion in der Template-Klasse
template <class T>
class Foo
{
...
// Template für nicht weiter definierte Typen
template <class S>
static Foo<S> Bar(void)
{
printf("Error: Type not supported.");
}
// Für einzelne ausgewählte Typen
template <>
static Foo<int> Bar<int>(void)
{
...
}
};
funktioniert soweit, allerdings ist der Aufruf reichlich fies:
Foo<int> obj = Foo<int>::Bar<int>();
Klingt noch ok, aber
Foo<int> obj = Foo<unsigned char>::Bar<int>();
wäre das gleiche. Der erste Template-Parameter ist völlig unwichtig.
Gibt es hier eine bessere Lösung?
Kurze Zusammenfassung: Es existiert eine Template-Klasse mit sehr vielen Funktionen für alle Typen, eine Funktion soll hinzu die für einzelne Typen besonderes macht, ohne dass der Code schwierig im Bezug Wartung und Lesbarkeit wird.
PS: Kann man eigentlich irgendwie zur Laufzeit feststellen, ob eine Variablen von einem bestimmten Typ ist?
ich habe ein kleines Problem, für dass ich noch keine vernünftige Lösung gefunden habe:
Ich habe eine Klasse
template <class T>
class Foo
{
...
};
die sehr viele Funktionen für alle T enthält. Nun möchte ich noch eine (statische) Funktion hinzufügen, die für ein dutzend T etwas leicht anderes macht. Normale Template-Spezialisierung mit z.B.
template <>
class Foo<int>
{
...
};
führt dazu, dass ich die komplette Klasse naherzu identisch neu definieren muss, was Wartung des Codes extrem unhandlich werden lässt, vor allem für die anderen Projektmitarbeiter, die sich das nicht ausgedacht haben. Eine spezialisierte Template-Funktion in der Template-Klasse
template <class T>
class Foo
{
...
// Template für nicht weiter definierte Typen
template <class S>
static Foo<S> Bar(void)
{
printf("Error: Type not supported.");
}
// Für einzelne ausgewählte Typen
template <>
static Foo<int> Bar<int>(void)
{
...
}
};
funktioniert soweit, allerdings ist der Aufruf reichlich fies:
Foo<int> obj = Foo<int>::Bar<int>();
Klingt noch ok, aber
Foo<int> obj = Foo<unsigned char>::Bar<int>();
wäre das gleiche. Der erste Template-Parameter ist völlig unwichtig.
Gibt es hier eine bessere Lösung?
Kurze Zusammenfassung: Es existiert eine Template-Klasse mit sehr vielen Funktionen für alle Typen, eine Funktion soll hinzu die für einzelne Typen besonderes macht, ohne dass der Code schwierig im Bezug Wartung und Lesbarkeit wird.
PS: Kann man eigentlich irgendwie zur Laufzeit feststellen, ob eine Variablen von einem bestimmten Typ ist?