Templates, Einschränkungen



  • Hallo Leute,

    kurze Frage, wenn ich Beispielsweise eine Template-Funktion betrachte:

    template <typename T>
    int foo(T x)
    {
     ...
    }
    

    Gibt es dann eine Möglichkeit das T so einzuschränken, dass es z.B. nur für numerische Datentypen packt, d.h. so etwas soll möglich sein:

    foo<int>(1)
    

    oder

    foo<float>(1.5)
    

    aber nicht

    foo<string>("haha")
    

    Habe nach so etwas wie "isNumeric" oder so gesucht leider ohne Erfolg. Hat da evtl jemand von euch eine Idee?

    Gruß 🙂



  • Also, um eins musst Du dir keine Sorgen machen: Wenn Du für T etwas einsetzen willst, was nicht "passt", dann bekommst Du den Fehler schon zur Compile-Zeit. Es wäre natürlich schön, wenn man solche Beschränkungen im Code ohne Template-Tricks aufschreiben könnte. Das ist aber noch nicht machbar. Das Feature, mit dem das mal möglich sein soll, heißt "Concepts".

    Aber, ein Beschränken (per Template-Tricks) hat natürlich noch den Vorteil, dass man damit die Überladungsmenge klein halten kann. Das Blöde ist, dass so ein Template-Instantiierungsfehler NACH der Überladungsauflösung kommen würde. Es kann also sein, dass nur ein Kandidat instantiiert werden kann, die Überladungsmauflösung aufgrund einer Mehrdeutigkeit aber nicht machbar ist. In solchen Fällen ist das Beschränken sinnvoll, auch wenn es zur Zeit noch relativ hässlich aussieht:

    C++98 und Boost:

    template<class T>
    typename boost::enable_if_c<
      (boolscher Ausdruck mit T zum Aktivieren des Templates)
    int>::type foo(T x);
    

    C++11:

    #include <type_traits>
    
    #define REQUIRES(...) ,class=typename std::enable_if<(__VA_ARGS__)>::type
    
    template<class T
      REQUIRES( std::is_arithmetic<T>::value )
    >
    int foo(T x);
    

    wobei der boolsche Ausdruck so etwas sein kann wie sizeof(T)>8 oder irgend etwas mit den traits aus type_traits oder Boost.TypeTraits.

    Den Rest kannst Du googeln:

    • enable_if
    • type traits


  • wenn ich Beispielsweise eine Template-Funktion betrachte:

    Warum haben Leute denn immer Templatefunktionen und Templateklassen?!? Habt ihr dann auch Dachautos?
    Also:
    * Eine Vorlage für eine Klasse -> Klassentemplate
    * Eine Vorlage für eine Funktion -> Funktionstemplate
    * Ein Dach für eine Auto -> Autodach.
    Ergibt doch Sinn, oder?



  • Hast recht, merke ich mir ^^


Anmelden zum Antworten