Templates nur für bestimmte klassen zulassen



  • Guten Abend,

    gibt es in C++ die Möglichkeit Templates nur für bestimmte Klassen zuzulassen?
    Also, dass man meine Klasse

    template< class T >
    class Foo;
    

    nur mit den Typen int und sagen wir einfach mal Bla benutzen kann?

    Frohe Ostern



  • Du müsstest dafür sorgen, das jede normale template Instanz nicht kompiliert.
    Und dann für Int und Bla spezialisieren.



  • Stichwort: Constraints/Traits. Leider bietet C++ hier keinen builtin Support. Aber man kann zumindest auf diverse Bibliotheken zurückgreifen, wie zB boost. Aber auch ohne solche Bibliotheken kann man das Verhalten recht einfach simulieren. Eine Möglichkeit wäre zB Spezialisierung.

    template <class T>
    struct FooConstraints;
    
    template <>
    struct FooConstraints<int>
    {
        typedef int type;
    };
    
    template <>
    struct FooConstraints<Bla>
    {
        typedef Bla type;
    };
    
    template <class T>
    class Foo
    {
        private:
            typedef typename FooConstraints<T>::type dummy_; // static assert
        // Implementierung
        // ...
    };
    
    int main()
    {
        Foo<int> a;  // ok
        Foo<char> b;  // error
    }
    

    Das ganze lässt sich sicherlich auch noch eleganter über eine Typliste realisieren.



  • Danke schonmal, aber das hilft mir noch nicht ganz weiter.
    Ich habe folgenbdes Problem.

    template< typename T >
    class Test
    {
        public:
            Test( void ) {};
            ~Test( void ) {};
    
            typedef T type;
    };
    
    template< typename T>
    class Test2
    {
        public:
            void Foo( void );
    };
    
    template< typename T >
    void Test2< T >::Foo( void )
    {
        T::type meinTyp;  // Hier kommt der Fehler 
    }
    

    Gibt es eine Möglichkeit dies zu realisieren?



  • OPPler schrieb:

    Gibt es eine Möglichkeit dies zu realisieren?

    wenn du uns sagst, was für ein fehler kommt, können wir den auch bestimmt lösen.
    aber es beschleicht mich das gefühl, dass dein problem nichts mit der fragestellung zu tun hat.

    eine mögliche realisierung wurde bereits genannt 😉

    bei mir kompiliert dein code übrigens ohne probleme:

    int main()
    {
    	Test2<Test<int> > t;
    	t.Foo();
    }
    


  • Xantus schrieb:

    bei mir kompiliert dein code übrigens ohne probleme:

    Dann ist dein Compiler bissl krank 🙂

    Im Code fehlt ein typename, ...

    typename T::type meinTyp;
    

    ... da type vom Template-Parameter T abhängt ...



  • Danke KasF 🙂


Anmelden zum Antworten