template mit Vererbung



  • Hi,
    habe noch eine Frage zu templates. Kann man da auch fordern, dass ein Typ eine Spezialisierung eines anderen ist?
    z.B:

    template<typename TV, typename T>
    class example
    {
        example(TV::T t, TV tv ){} //geht nicht
        //example(T t, TV tv ){} //geht, jedoch habe ich hier nicht die Bedingung, dass TV Spezialisierung von T ist
    };
    

    mit Funktions-Pointer gehts auch:

    template<typename TV, typename T>
    class example2
    {
        example2(void (TV::T::*tfun )()){
        } 
    };
    

    Am Ende möchte ich die Klasse mit zwei Funktionen-Pointer als Parameter haben, wobei eine als Übergabe Spezialisierung der anderen bekommt.
    In etwa so:

    template<typename TV, typename T>
    class example3
    {
        example3(void (*tfun )(TV::T), void (*tvfun )(TV)){
        } 
    };
    

    Wie schreibe ich das richtig?



  • oder hier mit std::function (geht auch nicht)

    template<typename TV, typename T>
    class example3
    {    
        example3(std::function<void(TV::T)> *tfun, std::function<void(TV)> *tvfun){
        } 
    };
    


  • ich bin mir nicht sicher, ob ich dich richtig verstanden habe.

    Suchst du sowas wie
    static_assert(std::is_base_of<Base, Derived>::value, "");



  • wob schrieb:

    ich bin mir nicht sicher, ob ich dich richtig verstanden habe.

    Suchst du sowas wie
    static_assert(std::is_base_of<Base, Derived>::value, "");

    Hi, danke für die Anwort. Das kannte ich noch nicht und kann auch hilfreich sein, könnte auch die Notlösung sein aber ich suche etwas, dass dies schon zur Compilezeit feststellt.

    Ich also eine Klasse habe, die (std:function) mit Klasse und Elternklasse als Eingabe hat.

    Also ein Beispiel ohne Template (die funktionert):

    class A {}; 
    class B : public A {};
    class C{
       C(B::A a, B b){};
    };
    

    Wie schreibe ich nun Klasse C um, dass es nicht nur A und B akzeptiert sondern. Alle Klassen A* mit allen jeweils möglichen Spezialisierungen B*.



  • static_assert wird zur Compilezeit ausgewertet.



  • typename



  • manni66 schrieb:

    static_assert wird zur Compilezeit ausgewertet.

    Schreibt man das dann in den Konstruktor der Funktion?

    blurbs schrieb:

    typename

    typename was?


Log in to reply