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..."

    siehe auch
    http://cpp-next.com/archive/2010/09/expressive-c-why-template-errors-suck-and-what-you-can-do-about-it/



  • pumuckl schrieb:

    http://cpp-next.com

    Danke:) Ging irgendwie an mir vorbei.



  • 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 lieber static_assert(boost::is_base_of...) (bzw. BOOST_STATIC_ASSERT bzw. boost::is_convertible<T*, U*> ).

    Mit boost::enable_if bekommst du auch bloss ne Fehlermeldung, dass keine passende Template-Spezialisierung gefunden wurde oder dergleichen - aber nicht warum. Auch nicht sehr hilfreich.

    boost::is_base_of findet leider auch private Basisklassen, in dem Fall schnalzt es dann erst wieder mit der 200 Zeilen Fehlermeldung.
    Und boost::is_convertible<T*, U*> macht Compiler-Fehler, wenn die Konvertierung ambiguous wäre.

    Alles Kacke 😃


Anmelden zum Antworten