templates einschränken



  • hi
    kann man (wenn ja wie kann man) bei einem template die variablen einschränken?

    bsp:

    template<class T> 
    void foo(T t);//hier soll T z.b. nur gleich einem primitiven datentyp sein
    
    class asdf;
    template<class T> 
    void foo(T t);//hier soll T nur asdf oder eine abgeleitete klasse sein.
    

    schonmal danke für antworten



  • Google mal nach boost::enable_if.



  • Beitrag zu einem ähnlichen Thema:
    http://www.c-plusplus.net/forum/p1978346#1978346



  • Das ist so ein Thema bei dem ich finde, dass C++ keine zufriedenstellende Lösung anbietet. Eine Möglichkeit wäre z.B. Gefrickel mit std::is_same.
    @Alle die jetzt sagen, der Compiler gibt doch eh einen Fehler: Ja, wahrscheinlich schon, aber meistens einen unlesbaren.
    Ich habe irgendwann mal etwas über Concepts gehört, da konnte man definieren, welche Konzepte ein Typ mitbringen muss. Bin mir jetzt aber gerade nicht sicher, ob das überhaupt in den Standard gesteckt wurde.. Edit: Tja.. http://en.wikipedia.org/wiki/Concepts_(C%2B%2B) oO



  • Wenn du es einschränken musst, würd ich mir mal überlegen, ob das wirklich ein template sein sollte. Warum dürfen es nur primitive Typen sein? Was spricht dagegen z.B. einen std::complex durchzuschicken?
    Im Fall von "nur asdf oder abgeleitete Klasse" würd ich auch jeden Fall mal meinen, dass du eigentlich kein template, sondern eine normale Funktion haben willst.



  • templatefrage schrieb:

    class asdf;
    template<class T> 
    void foo(T t);//hier soll T nur asdf oder eine abgeleitete klasse sein.
    

    Na, dann machen wir doch einfach

    void foo(asdf& t);
    


  • void foo(asdf* t);
    

    heißen ?



  • wieso?



  • Wenn es im Kontext Sinn macht, einen Nullzeiger übergeben zu dürfen, okay. Ansonsten würde ich die Referenz vorziehen.



  • Zur Beschränkung auf primitive typen:
    Wie wärs mit

    template<class T> 
    void foo(T t) //hier soll T z.b. nur gleich einem primitiven datentyp sein
    {
      static_assert(Loki::TypeTraits<T>::isFundamental, "T ist kein primitiver Typ");
    }
    

    Musst dir dann nur eben loki ziehen. Für diese Sachen wirst du denke ich mit header only auskommen.



  • cooky451 schrieb:

    Ich habe irgendwann mal etwas über Concepts gehört, da konnte man definieren, welche Konzepte ein Typ mitbringen muss. Bin mir jetzt aber gerade nicht sicher, ob das überhaupt in den Standard gesteckt wurde..

    Wurde von C++11 wieder entfernt, weil zu unausgereift. Mir gefällt an den Concepts nicht, dass bisher oft die Fehlerlesbarkeit als Hauptargument angeführt wurde. Das ist meiner Meinung nach nicht Rechtfertigung genug für ein neues, derart komplexes Sprachmittel. Ich habe mich aber auch nie ausführlich mit Concepts befasst, nicht zuletzt, weil sie – wenn überhaupt – erst in ferner Zukunft relevant werden.

    Q schrieb:

    Musst dir dann nur eben loki ziehen.

    Nein, C++11 hat Type Traits und damit auch std::is_fundamental .

    Aber dot hat schon Recht, man muss einen guten Grund haben, um die Generizität einzuschränken.


Log in to reply