Template Typen einschränken



  • Hallo,

    ist es möglich, Typen einzuschränken?

    Folgendes Beispiel:
    template<class T> struct eineKlasse{T member;};

    Nun möchte ich, dass T zum Beispiel nur int oder char sein darf.
    Wie bekomm ich das in C++ hin?



  • Wieso musst du das hinbekommen?



  • c++ templates schrieb:

    Hallo,

    ist es möglich, Typen einzuschränken?

    Folgendes Beispiel:
    template<class T> struct eineKlasse{T member;};

    Nun möchte ich, dass T zum Beispiel nur int oder char sein darf.
    Wie bekomm ich das in C++ hin?

    Bspw. static_assert . Aber ob das Design so sinnvoll ist, ist eine ganz andere Frage...



  • Zum Beispiel

    #include <iostream>
    #include <cstdlib>
    using namespace std;
    
    template<typename T>
    struct TestCharOrInt;
    
    template<>
    struct TestCharOrInt<char>
    {
    };
    template<>
    struct TestCharOrInt<int>
    {
    };
    
    template<class T>
    struct eineKlasse:TestCharOrInt<T>
    {
        T member;
    };
    
    int main()
    {
        eineKlasse<char> ch;
        eineKlasse<int> i;
        eineKlasse<double> d;
    }
    


  • Stichworte: Spezialisierung, enable_if.

    Elegante Lösung mit C++11 variadic templates.

    template <class T, class... Candidates> struct is_one_of;
    
    template <class T, class U, class... Candidates>
    struct is_one_of<T, U, Candidates...> : is_one_of<T, Candidates...> {};
    
    template <class T, class... Candidates>
    struct is_one_of<T, T, Candidates...> : std::true_type {};
    
    template <class T>
    struct is_one_of<T> : std::false_type {};
    
    template<class T> struct eineKlasse
    { 
      static_assert(is_one_of<T, int, char>::value, "Wrong type!");
      T member;
    };
    

Anmelden zum Antworten