Template typ abfragen



  • Kann man bei templates den Typ prüfen und dann anderen Code kompilieren lassen?
    Irgendwie sowas?

    template < typename T >
    void max(T x)
    {
    	//Code...
    	??if T == std::string??
    		//Code 1
    	??else??
    		//Code 2
    	//Code...
    }
    


  • Nennt man Spezialisierung:

    template < typename T > 
    void max(T x) 
    { 
     // default
    } 
    
    template <>
    void max ( std::string x )
    {
     // if T == std::string
    }
    
    template <>
    void max ( int x )
    {
     // if T == int
    }
    


  • Also müsste ich das für mein Beispiel so machen oder geht das einfacher?

    template < typename T >
    void max(T x)
    {
    	//Code... 
    
    	maxIntern(x);
    
    	//Code... 
    }
    
    template < typename T >
    void maxIntern(T x)
    {
    	// else
    }
    
    template <>
    void maxIntern( std::string x )
    {
    	// if T == std::string
    }
    


  • ??????? schrieb:

    Also müsste ich das für mein Beispiel so machen oder geht das einfacher?

    template < typename T >
    void max(T x)
    {
    	//Code... 
    
    	maxIntern(x);
    
    	//Code... 
    }
    
    template < typename T >
    void maxIntern(T x)
    {
    	// else
    }
    
    template <>
    void maxIntern( std::string x )
    {
    	// if T == std::string
    }
    

    Du brauchst maxIntern() nicht. Spezialisiere max(), wie drakon es gezeigt hat.

    Stefan.



  • Über und unter maxIntern steht aber Code. Soll der dann in jeder spezialisierung dupliziert werden?



  • probiers mal mit boost::is_same



  • ??????? schrieb:

    Über und unter maxIntern steht aber Code. Soll der dann in jeder spezialisierung dupliziert werden?

    Also wenn nur ein Teil spezialisiert sein soll, kannst du das mit einem solchen Helper durchaus machen.



  • Ich frag mich nur grad, was der Sinn der Funktion ist 😃

    void max( T x );
    

    max() gibt normalerweise das größte Objekt in einer Reihe von übergebenen Objekten zurück. Bei dir gibts nur einen Parameter und keinen Rückgabewert 😃

    Denkbar wäre noch, dass du ermitteln willst, ob dieser Wert der maximal mögliche ist (k.A. wie du das bei string machen willst...), aber da wäre als Rückgabewert bool nötig.

    Letzte Option: Du willst das übergebene Objekt auf das mögliche Maximum setzen. Dann bedarf es aber nicht call-by-value sondern call-by-reference.



  • Nur als Anmerkungen:
    Es muss nicht unbedingt das Template spezialisiert werden, es kann auch Überladung für die Sepzialfälle benutzt werden.

    Simon



  • ??????? schrieb:

    Irgendwie sowas?

    template < typename T >
    void max(T x)
    {
    	//Code...
    	??if T == std::string??
    		//Code 1
    	??else??
    		//Code 2
    	//Code...
    }
    

    Wozu? Was soll denn max eigentlich machen? Ich frage, weil die Lösung Deines Problems eventuell anders eleganter geht.

    Gruß,
    SP



  • Ein Template ? und dann noch auf veschiedene Typen unterschiedlich reagieren !?

    Sebastian Pizer schrieb:

    Wozu? Was soll denn max eigentlich machen? Ich frage, weil die Lösung Deines Problems eventuell anders eleganter geht.



  • Hm, wenn das eine normale Maximum-Funktion wäre (also zwei Parameter und nicht void -Rückgabetyp), wäre vielleicht ein Überladen des operator< geeigneter.

    Aber den momentanen Sinn sehe ich auch nicht, von daher wäre es gut möglich, dass das eleganter ginge.



  • KasF schrieb:

    Sebastian Pizer schrieb:

    Wozu? Was soll denn max eigentlich machen? Ich frage, weil die Lösung Deines Problems eventuell anders eleganter geht.

    Ein Template ? und dann noch auf veschiedene Typen unterschiedlich reagieren !?

    verschiedene Typen? Ok
    unterschiedlich reagieren? Hmmm....

    Wenn du mit "unterschiedlich reagieren" nur die Syntax anpasst, ist das ja OK. Wenn Du allerdings bei einem bestimmten Typen etwas völlig anderes (rein logisch) machst, ist das eher schlecht, weil Du den Namen der Funktion mit unterschiedlichen Bedeutungen belegst.

    Gruß,
    SP


Anmelden zum Antworten