Es sieht aus wie ich ein grundlegendes Missverständnis über C++ hatte: <C++ Alternativen * Zeiger auf void (dh keine Vorlagen)
Ich mag die polymorphe Containerlösung. Danke SO, für das Bringen zu dieser Aufmerksamkeit :)
So, wir müssen ein relativ generisches Behälterart-Objekt verursachen. Es kommt auch vor, einige Geschäftslogik einzukapseln. Wir müssen jedoch im Wesentlichen beliebige Daten in diesem Container speichern - von primitiven Datentypen bis hin zu komplexen Klassen.
So würde man sofort auf die Idee einer Template-Klasse springen und damit fertig sein. Ich habe jedoch festgestellt, C++ Polymorphismus und Vorlagen nicht gut zusammen spielen. Da es eine komplexe Logik gibt, die wir arbeiten müssen, bleibe ich lieber bei Vorlagen ODER Polymorphie und versuche nicht, C++ zu bekämpfen, indem ich beides mache.
Schließlich, da ich das eine oder andere machen möchte, würde ich Polymorphismus bevorzugen. Ich finde es viel einfacher, Einschränkungen wie "dieser Container enthält vergleichbare Typen" darzustellen - a la java.
Bring mich zum Thema der Frage: Am abstraktesten stelle ich mir vor, dass ich eine rein virtuelle "Container" -Schnittstelle haben könnte, die etwas wie "push (void * data) und pop (void * data)" hat (Für den Rekord versuche ich nicht wirklich, einen Stapel zu implementieren).
Allerdings mag ich nicht void * auf der obersten Ebene, nicht zu erwähnen, die Signatur wird jedes Mal ändern, wenn ich eine Einschränkung auf die Art von Daten hinzufügen möchten, mit denen ein konkreter Container arbeiten kann.
Zusammenfassung: Wir haben relativ komplexe Container, die verschiedene Möglichkeiten haben, Elemente abzurufen. Wir wollen in der Lage sein, die Beschränkungen für die Elemente zu variieren, die in die Container gelangen können. Elemente sollten mit mehreren Arten von Containern arbeiten (solange sie die Beschränkungen dieses bestimmten Containers erfüllen).
Edit: Ich sollte auch erwähnen, dass die Container selbst polymorph sein müssen. Das ist der Hauptgrund dafür, dass ich Templates nicht verwenden möchte.
Also - sollte ich meine Liebe für Java-Typ-Schnittstellen fallen lassen und mit Vorlagen gehen? Sollte ich void * verwenden und alles statisch werfen? Oder sollte ich mit einer leeren Klassendefinition "Element" gehen, die nichts deklariert und diese als meine Top-Level-Klasse in der "Element" -Hierarchie verwendet?
Einer der Gründe, warum ich Stapelüberlauf liebe, ist, dass viele der Antworten einige interessante Einblicke in andere Ansätze bieten, die ich nicht einmal in Betracht gezogen hätte. Vielen Dank im Voraus für Ihre Einsichten und Kommentare.
was meinst du "Polymorphismus und Vorlagen spielen nicht gut zusammen"? –
Speziell ein polymorpher Container - ich habe vergessen, diese Anforderung zu erwähnen. Soweit ich weiß, kann es nicht gemacht werden .. aber dann, was weiß ich. – Voltaire
> Ich habe die Notwendigkeit, dass die Behälter selbst polymorph sind. Meine Antwort entsprechend aktualisiert. – Lev