Ersetzen Templates Polymorphie?
-
Kann es sein das Templates Polymorphie nutzlos machen?
Ich meine anstatt:
#include <iostream> using namespace std; int PrintSomething ( int a ) { return a; } string PrintSomething( string a ) { return a; } int main() { cout << PrintSomething ("abc") <<endl; cout<< PrintSomething ( 123 ) << endl; return 0; }
Kann ich doch auch einfach schreiben:
So hab ich doch weniger schreibtarbeit und kann ganz einfach alle Datentypen ausgeben.#include <iostream> using namespace std; template <class myType> myType PrintSomething(myType a ) { return a; } int main() { cout << PrintSomething ("abc") ; return 0; }
-
Vorlage schrieb:
Kann es sein das Templates Polymorphie nutzlos machen?
Nö. Überladung nimmst du, wenn du bestimmte Typen willst, in deinem Fall int und string. Bei dem Template kannst du alles mögliche reinstecken. Außerdem funktionieren die überladenen Funktionen nur für die bestimmten Typen, dein Funktionstemplate muss für alle Typen funktionieren. Also im Endeffekt zwei völlig unterschiedliche Anwendungsgebiete.
-
Nein, machen sie nicht. Es gibt aber starke Parallelen, wie du bemerkt hast. Daher ja auch die erwarteten Sprachfeatures Concepts/Modules für den nächsten Standard. So lange wirst du dich wohl mit CRTP begnügen müssen, wenn du etwas mehr Typsicherheit willst. Bzw. schönere Compilierfehler, die bekommst du in jedem Fall wenn etwas nicht läuft.
Also: Wo ersetzen Templates Polymorphie?
Überall da, wo der Typ bereits zur Compilezeit bekannt ist. Das kann z.B. für Algorithmen gelten. (Siehe <algorithm> der Standardbibliothek.)Und jetzt kannst du dir auch denken, wo Templates Polymorphie nicht ersetzen. Genau dann, wenn der Typ zur Compilezeit nicht bekannt ist. Einen vector<unique_ptr<object*>> bekommst du mit Templates nicht hin.
Edit:
Deinem Code nach zu urteilen weißt du aber nicht mal was Polymorphie eigentlich ist, lol.
-
unique_ptr kenn ich noch nicht.
So steht das in einer Powerpoint Präsentation auser Schule:
In C++ kann man mehreren Funktionen den
gleichen Namen geben, wenn sie sich entweder...
in der Anzahl der Übergabeparameter oder
in den Datentypen der übergebenen Parameter
unterscheidenOops in der Präsentation steht das im Zusammenhang vom Konstruktor
class table { public: int nr; string str; // Polymorphie table () {} table ( int n , string s ) : nr(n) , str (s) { } };
Aber gilt das für Funktionen nicht auch?
Ok meine Funktionen war eben nicht in einer Klasse ... Wie nennt man das was ich geschrieben habe?
-
Vorlage schrieb:
Wie nennt man das was ich geschrieben habe?
Overloading. Und die Beschreibung aus dieser Präsentation ist dafür korrekt. Nur dieser kleine Kommentar "Polymorphie" nicht.
-
In der Präsentation steht auch:
Polymorphie
(=Vielgestaltigkeit)
bezeichent man auch als Überladen von Funktionenversteh ich da was falsch oder hat der Lehrer selber keine Ahnung was er da macht? ...
Ich glaub ich les gleich mal im C++ Primer nach irgendwie gefällt mir die Präsentation nicht.
-
Vorlage schrieb:
Polymorphie
(=Vielgestaltigkeit)
bezeichent man auch als Überladen von Funktionenähm... nein.
Polymorphie ist:
class Form { public: virtual Print()=0; }; class Kreis : public Form { public: void Print() {...}; }; class Rechteck : public Form { public: void Print() {...}; }; std::vector<Form*> formen; formen.push_back(new Kreis()); formen.push_back(new Rechteck()); for_each(Form* form : formen) form->Print();
Dabei wird dann "wie von Zauberhand" die richtige Print()-Methode aufgerufen.
Disclaimer: nur ein schnell zusammengetipptes Beispiel. Natürlich sollte man new niemals so benutzen, sondern die Instanzen in einem Smartpointer halten.
edit: gerade folgende "Definition" gefunden:
Bei Poymorphie haben die Methoden die gleiche Signatur, sind jedoch in verschiedenen Klassen implementiert. Zur Laufzeit wird anhand des Objekttyps entschieden, welche Methode gerufen wird.
Überladen besagt, dass die Methoden den gleichen Namen, aber veschiedene Parameter haben.
-
Danke für das Beispiel.
Jetzt werde ich erst mal diese dämliche Präsentation löschen!
Das ärger mich jetzt schon wieder das man was lernt was falsch ist.
-
Vorlage schrieb:
versteh ich da was falsch oder hat der Lehrer selber keine Ahnung was er da macht? ...
Bei solchen Fragen antworte ich immer gerne: Was hälst du für wahrscheinlicher? Traurigerweise macht die Frage auch hier Sinn. Ich bin nur froh aus dem Verein raus zu sein. So peinlich war mein Lehrer dann aber doch nicht.
-
In C++ versteht man unter Polymorphismus eigentlich nur Inklusionspolymorphismus, d.h. virtuelle Funktionen. Templates sind eigentlich parametrischer Polymorphismus, nur nennt das in C++ kaum jemand so. Überladen ist bei manchen Autoren auch eine Form von Polymorphismus.
Aber die Präsentation stellt es ja so dar, als sei Überladen dasselbe wie Polymorphismus. Das ist natürlich kompletter Unsinn.
-
Vorlage schrieb:
Kann es sein das Templates Polymorphie nutzlos machen?
Wenn du mit Polymorphie, polymorphe Klassen mit ihren virtuellen Funktionen meinst: Nö. Die Dinger sind eigentlich orthogonal zueinander.
@Bashar: "Polymorphismus" oder "Polymorphie"?
-
krümelkacker schrieb:
@Bashar: "Polymorphismus" oder "Polymorphie"?
Öhm.
Wenn das einen Unterschied macht, bitte erklären.
-
Bashar schrieb:
Öhm.
Wenn das einen Unterschied macht, bitte erklären.
Der Begriff "Polymorphismus" wird eigentlich nur in der Genetik benutzt -> Sequenzvariation.
In der Programmierung benutzt man Polymorphie für vieles, z.B. auch die Überladung von Operatoren und Funktionen usw. Allerdings wird in C++ Polymorphie für Polymorphie im objektorientierten Sinne genommen, also nicht für Funktionsüberladungen. Ob man unter Polymorphie jetzt nur die Laufzeitpolymorphie (ableiten + virtuelle Funktionen & Co.) oder auch die Compilezeitpolymorphie (über Templates) versteht, ist unterschiedlich. Meistens wird Compilezeitpolymorphie aber explizit so genannt. "parametrische Polymorphie" wird sowas eher selten genannt (wenn überhaupt)
-
pumuckl schrieb:
Der Begriff "Polymorphismus" wird eigentlich nur in der Genetik benutzt -> Sequenzvariation.
Oder wenn man wie ich englische Begriffe 1:1 ins Deutsche überträgt. Der Angelsachse sagt zu Polymorphie polymorphism.
Allerdings wird in C++ [...] "parametrische Polymorphie" wird sowas eher selten genannt (wenn überhaupt)
Das hab ich doch gesagt.