Template für Methoden



  • Hi! Ich möchte nur einer Methode meiner Klasse ein Template zuweisen, die Klasse selber soll kein Template haben. Zum Beispiel so:

    // Klasse
    class Container
    {
    public:
    
    	template<class T>
    	T* Do(char* txt)
    	{
    		T* t = new T(txt);
    		return t;
    	}
    };
    
    //Benutzen
    Container container;
    C* c = container.Do<C>("bla");
    

    Weiß jemand wie man soetwas machen kann?



  • Genau so, wie Du es da machst. Das setzt aber voraus, dass T mit char* konstruierbar ist.



  • Okay, hät jetzt nicht gedacht das mein Pseudo-Code Funktioniert!

    Danke 😃



  • Wie kann ich denn in meiner Funktion herausfinden von welchem Typ der Template ist?

    z.B:

    // Klasse
    class Container
    {
    public:
    
        template<class T>
        T* Do(char* txt)
        {
            if(T == float)
            {
                 T* t = new T(txt);
                 return t;
            }
            else
            {
                return 0;
            }
        }
    };
    


  • typeid(T) == typeid(float)

    bb

    edit:
    wozu brauchst du das eigtl?
    spezialisierung wäre aber wahrscheinlich das, was da eleganter wäre ^^
    außerdem sollte nen Container erstens keine so komische Fkt Do haben und zweitens doch mit jedem typen gleich funktionieren!?



  • Nunja, es kommt bei mir ab und zu vor das ich mal ne sonderausnahme machen muss, wenn T eine bestimmte Klasse ist die ein wenig anders funktioniert. Im moment schreibe ich an einem 3D Framework, und die Modelle, Animationen und Texturen die geladen werden sollen beim laden über die Content Klasse noch im Content gespeichert werden. Wenn ich dann zum Beispiel den Content lösche, sollen auch gleich alle geladenen Objekte vom Speicher entfernt werden.



  • Code-Walker schrieb:

    Nunja, es kommt bei mir ab und zu vor das ich mal ne sonderausnahme machen muss, wenn T eine bestimmte Klasse ist die ein wenig anders funktioniert.

    idR ist es am sinnvollsten hier die jeweilige funktionalität auszulagern:

    template<typename T>
    void foo(T& t) {} //allgemein
    
    void foo(Special& s) {} //spezielles verhalten
    
    template<typename T>
    class Foo {
    //...
    
      void doit() {
        T obj;
        foo(obj); //allgemein oder speziell
      }
    };
    

    meistens kann man das aber wegdesignen.

    Im moment schreibe ich an einem 3D Framework, und die Modelle, Animationen und Texturen die geladen werden sollen beim laden über die Content Klasse noch im Content gespeichert werden. Wenn ich dann zum Beispiel den Content lösche, sollen auch gleich alle geladenen Objekte vom Speicher entfernt werden.

    das könnte so aussehen dass die klasse Content selber wenn sie zerstört wird alle referenzen auflöst.

    prinzipiell kann man in fast jeder situation eine generalisierung herausbekommen die sinn macht. spezialisierungen sollten wirklich nur eine seltene ausnahme sein.


Log in to reply