Template-Typ eingrenzen
-
Hi Leute
ich hab mal ne Frage zu Templates.
Kann man den Typ des Templates ( "T" ) auch irgendwie eingrenzen auf Derivate einer bestimmmten Basisklasse?
Ich vermute nicht... Oder doch?ja oder nein reicht mir völlig als Antwort

(wenn "ja", dann interessiert mich auch das "wie"
)
-
ja.
google mal nach boost::enable_if und boost::is_base_of
-
ok, danke. Das guck ich mir mal an.
-
Oft reicht es auch Dinge die man mit T machen will im Template einfach zu machen.
Mach im Template-Code z.B. ne implizite Konvertierung von T* zu BASE*, und der Compiler wird an der Stelle entsprechend nen Fehler melden, wenn der Parameter nicht passt (also T* nicht implizit zu BASE* konvertierbar ist).
-
hustbaer schrieb:
Oft reicht es auch Dinge die man mit T machen will im Template einfach zu machen.
Mach im Template-Code z.B. ne implizite Konvertierung von T* zu BASE*, und der Compiler wird an der Stelle entsprechend nen Fehler melden, wenn der Parameter nicht passt (also T* nicht implizit zu BASE* konvertierbar ist).
Ja, das war auch meine erste Idee... Ich wollte halt mal schauen ob es noch was "handfesteres" gibt

-
hustbaer schrieb:
Oft reicht es auch Dinge die man mit T machen will im Template einfach zu machen.
Depends. Wenn du den Code nur selbt und nur jetzt grade verwendest, okay. Wenn der Code wiederverwendet werden soll, wärs schon klasse, da ne aussagekräftige Fehlermeldung zu kriegen an Stelle von 200 Zeile Templatefehlermeldungen á la "instantiated from blah, instantiated from bläh..."
-
-
pumuckl schrieb:
hustbaer schrieb:
Oft reicht es auch Dinge die man mit T machen will im Template einfach zu machen.
Depends. Wenn du den Code nur selbt und nur jetzt grade verwendest, okay. Wenn der Code wiederverwendet werden soll, wärs schon klasse, da ne aussagekräftige Fehlermeldung zu kriegen an Stelle von 200 Zeile Templatefehlermeldungen á la "instantiated from blah, instantiated from bläh..."
OK.
Dann aber lieberstatic_assert(boost::is_base_of...)(bzw.BOOST_STATIC_ASSERTbzw.boost::is_convertible<T*, U*>).Mit
boost::enable_ifbekommst du auch bloss ne Fehlermeldung, dass keine passende Template-Spezialisierung gefunden wurde oder dergleichen - aber nicht warum. Auch nicht sehr hilfreich.boost::is_base_offindet leider auch private Basisklassen, in dem Fall schnalzt es dann erst wieder mit der 200 Zeilen Fehlermeldung.
Undboost::is_convertible<T*, U*>macht Compiler-Fehler, wenn die Konvertierung ambiguous wäre.Alles Kacke
