Spezialisierung eines Funktionstemplates eines Klassentemplates
-
Hallo,
ich habe ein Klassentemplate mit zwei templateparametern und möchte zusätzlich auch ein Funktionstemplate in der Klasse haben. Dieses Funktionstemplate möchte ich dann jedoch spezialisieren. Geht das überhaupt?
template < class T, class U > class TestClass { template < typename V > void Foo(const V& data) {} void update(); } /* Nun möchte ich Foo() spezialisieren...ich denke mir das ungefähr so..geht aber nicht. */ template < class T, class U > template < > void TestClass< T,U >::Foo(const double& data); /* cpp-Datei */ template < class T, class U > template < > void TestClass< T,U >::Foo(const double& data) { /*do something*/ }Der Grund ist, dass ich eigentlich nur U spezialisiert haben möchte wenn Foo aufgerufen wird (sprich Foo() wird von update() aufgerufen und dann soll Foo spezialisiert reagieren können).
In diesem Moment frage ich mich auch, ob ich nicht einfach die Klasse partiell spezialisieren sollte? hmm, aber muss ich dann auch alle anderen memberfunktionen (wie bsp. update() oben) neu schreiben?
Gibt es einen gänzlich besseren Weg?
Danke schonmal
-
Katachi schrieb:
Gibt es einen gänzlich besseren Weg?
Wieso überhaupt spezialisieren? Inwiefern ist das Verhalten da anders? Vielleicht suchst du Type Traits, aber dazu kenn' ich den Kontext zu wenig...
Template-Funktionen darfst du übrigens nicht in Source&Header aufteilen.
-
Hacker schrieb:
Katachi schrieb:
Gibt es einen gänzlich besseren Weg?
Wieso überhaupt spezialisieren? Inwiefern ist das Verhalten da anders?
Weil Foo auf Member des jeweiligen Typen zugreifen soll. Und ein Typ hat diese Member nicht, deswegen wäre eine Spezialisierung (die letzlich nichts macht) für diesen Typ, eine schnelle und einfach Art das Problem zu lösen. Denke type traits würde hier nicht passen oder?
Template-Funktionen darfst du übrigens nicht in Source&Header aufteilen.
Doch, da es sich um eine spezialisierung handelt muss sie sogar in die source datei sonst ist sie doppelt vorhanden bei der Kompilierung. Oder was meinst du?
-
Okay, ich habe es jetzt so gelöst, dass ich das Funktionstemplate aus dem Klassentemplate genommen habe und dann spezialisiert habe.
-
Das Funktionstemplate solltest du vermutlich lieber überladen als spezialisieren:
template < class T, class U > class TestClass { template < typename V > void Foo(const V& data) {} void Foo(double const& d) {} void update(); };Aber bei so einem allgemeinen Beisoiel kann man nicht sagen, ob du nicht doch einen der wenigen Sonderfälle hast, wo spezialisierung angebracht ist.
-
Katachi schrieb:
Okay, ich habe es jetzt so gelöst, dass ich das Funktionstemplate aus dem Klassentemplate genommen habe und dann spezialisiert habe.
Funktionen will man idR nicht spezialisieren sondern einfach Überladen. Das löst meistens die Probleme...
-
Katachi schrieb:
Hacker schrieb:
Katachi schrieb:
Gibt es einen gänzlich besseren Weg?
Wieso überhaupt spezialisieren? Inwiefern ist das Verhalten da anders?
Weil Foo auf Member des jeweiligen Typen zugreifen soll. Und ein Typ hat diese Member nicht, deswegen wäre eine Spezialisierung (die letzlich nichts macht) für diesen Typ, eine schnelle und einfach Art das Problem zu lösen. Denke type traits würde hier nicht passen oder?
Nein. Mach ein
static_assertoderenable_if...
-
pumuckl schrieb:
Das Funktionstemplate solltest du vermutlich lieber überladen als spezialisieren:
template < class T, class U > class TestClass { template < typename V > void Foo(const V& data) {} void Foo(double const& d) {} void update(); };Aber bei so einem allgemeinen Beisoiel kann man nicht sagen, ob du nicht doch einen der wenigen Sonderfälle hast, wo spezialisierung angebracht ist.
oh man, so einfach kann es sein... Vielen Dank!
-
Shade Of Mine schrieb:
Katachi schrieb:
Okay, ich habe es jetzt so gelöst, dass ich das Funktionstemplate aus dem Klassentemplate genommen habe und dann spezialisiert habe.
Funktionen will man idR nicht spezialisieren sondern einfach Überladen. Das löst meistens die Probleme...
thx, ist abgespeichert.
