Im Zusammenhang mit Spezialisierung für Zeiger habe ich noch eine weitere Frage.
Ich habe ein Containerklassentemplate in einer generischen Version
Code: Alles auswählen
template<typename Etype>
class Foo
{
public:
Foo(Etype data);
// more constructors, operators and functions come here
};
und dazu eine partielle Spezialisierung, die ein- oder- mehrdimensionale C-Arrays als Nutzlast im Konstruktor in Empfang nimmt
Code: Alles auswählen
template<typename Etype>
class Foo<Etype*>
{
public:
Foo(Etype* const data, short size);
Foo(Etype*const data, const short* const sizes);
// the rest is the same like in generic version
};
Bis auf den Konstruktor kann ich den Rest des Codes in beiden Versionen identisch halten: gleiche API und auch gleiche Implementation - da ich einzelne Objekte einfach genauso wie 1-dimensionale Arrays der Größe 1 behandeln kann.
Ich habe also mit der Spezialisierungslösung der ganzen Klasse bis auf diese 1-2 Konstruktoren, die sich unterscheiden, 2 komplett identische, redundante Implementationen der Klasse rumliegen, was natürlich eher unschön ist, auch wenn es sich größtenteils nur um Einzeiler handelt.
Gemeinsame Funktionalität in eine nicht generische Basisklasse auszulagern, hilft nur begrenzt, da Konsturktoren und Operatoren ja damit immer noch doppelt implementiert werden müssten (ja, die beiden Implementationen müssten dann jeweils nur die der Basisklasse explizit aufrufen, aber viele der Funktionen sind eh nur Einzeiler, da bingt das dann auch nicht viel).
Wie würdet ihr das lösen?
Ideal in meinen Augen ist, wenn ich für Etype Konstruktor A habe, nicht aber B und C, für Etype* hignegen Konstruktor B und C, nicht aber A, wähend der ganze Rest der API sowohl der generischen Version als auch der Pointer Spezialisierung aus dem selben Source generiert wird.
Mir ist dabei schon wichtig, dass man als Nutzer des Tempaltes einfach Foo<int>(myInt); oder Foo<int*>(myIntArray, arrSize); schreiben kann und nicht immer sowas umständliches schreiben muss wie Foo<int>(FooCreator<int>(myInt)); Foo<int*>(FooCreator<int*>(myIntArr, arrSize));
Danke im Voraus für eure Vorschläge.