Variabler Tupel-Container
-
Vielleicht noch einmal mit einem Beispiel:
template <typename... Types> class ListStore { private: std::vector< boost::tuple<Types...> > m_elements; }; // ... ListStore<int, char, string> store;Mit variadic templates eigentlich eine einfache Geschichte, aber die kennt MSVC2010 m.W. nicht.
-
die kennt bis jetzt nur der gcc
-
GCC ist sowieso der einzige, ernstzunehmende Compiler.
-
Sagt das nicht mir.

-
314159265358979 schrieb:
GCC ist sowieso der einzige, ernstzunehmende Compiler.
Naja, Intel solltest du nicht vergessen. Und Clang ist auch auf einem guten Weg, GCC vom Thron zu schubsen.

-
Der Intel Compiler ist nicht gratis, clang ist n Witz.
-
314159265358979 schrieb:
Der Intel Compiler ist nicht gratis, clang ist n Witz.
Ach, Clang ist noch jung. Die Features kommen schon nach und Clang hat den gewaltigen Vorteil dass er kein aufgeblähtes Monster mit verschwindenen Design ist. Schon mal Fehlermeldungen von Clang und GCC verglichen? Oder Geschwindigkeit beim Kompilieren? Dazu kommt noch die BSD statt GPL Lizenz + Kompatibilität zum GCC, ich denke hier entwickelt sich GCCs größter Gegner.

-
314159265358979 schrieb:
GCC ist sowieso der einzige, ernstzunehmende Compiler.
Definiere "ernstzunehmend"...
-
314159265358979 schrieb:
clang ist n Witz.
Wie aktuell sind Deine Erfahrungen mit clang? Gibt es überhaupt welche? Wenn ja, magste Deinen Satz mal erklären?
-
krümelkacker schrieb:
314159265358979 schrieb:
clang ist n Witz.
Gibt es überhaupt welche?
Zum Glück nicht. Ich habe sowas nicht nötig.
-
krümelkacker schrieb:
314159265358979 schrieb:
clang ist n Witz.
Wie aktuell sind Deine Erfahrungen mit clang? Gibt es überhaupt welche? Wenn ja, magste Deinen Satz mal erklären?
Er wollte mal mitreden, du kennst ihn ja: Große Klappe, nichts dahinter.
-
clangs C++11 Support ist unzureichend.
-
314159265358979 schrieb:
clangs C++11 Support ist unzureichend.
oh mein gott, ein compiler unterstützt einen nicht veröffentlichten Standard unzureichend

-
otze schrieb:
314159265358979 schrieb:
clangs C++11 Support ist unzureichend.
oh mein gott, ein compiler unterstützt einen nicht veröffentlichten Standard unzureichend

Der Standard ist schon lange fertig und war davor lange genug als Draft verfügbar.
-
Naja ich denke wir sollten uns freuen, dass auch für eine so alte Sprache wie c++ noch neue compiler entstehen; es zwingt einen ja niemand dazu, clang zu verwenden (verwende persönlich auch gcc wegen c++11).
StefanBo schrieb:
Vielleicht noch einmal mit einem Beispiel:
template <typename... Types> class ListStore { private: std::vector< boost::tuple<Types...> > m_elements; }; // ... ListStore<int, char, string> store;Mit variadic templates eigentlich eine einfache Geschichte, aber die kennt MSVC2010 m.W. nicht.
Suchst du vielleicht sowas in der Art?
class NullType; template< class A = NullType , class B = NullType , class C = NullType /*...*/ > class ListStore; template<> class ListStore<> { //0 Parameter }; template< class A > class ListStore< A > { //1 Parameter }; template< class A , class B > class ListStore< A , B > { //2 Parameter }; //...
-
314159265358979 schrieb:
clangs C++11 Support ist unzureichend.
Weil man noch den Standard von 2003 fertig implementiert. Und das über die Zeitspanne gesehen vielfach schneller als beim GCC.
Aber warts ab.
-
Suchst du vielleicht sowas in der Art?
Ja genau. Man könnte hier mit Boost Preprocessor mit Sicherheit eine Schleife erzeugen, die dann ausreichend Klassen erzeugt. Aber ich habe überlegt, ob das nicht eleganter geht.
In deinem Beispiel müsste ich ja jede Variante spezialisieren, das macht wenig Spaß, zumal sich die Varianten auch wirklich nur in der Anzahl und den Typen der Template-Argumente unterscheiden.
-
Ohne Präprozessormetaprogrammierung, Variadic Templates oder Boilerplatecode bekommst du die Funktionsaufrufsyntax für beliebig viele Argumente nicht hin.
Aber du könntest das Frontend von Hand gestalten und dann so schnell wie möglich versuchen, die unterschiedlichen Instanziierungen gemeinsam zu behandeln (evtl. durch Typlisten). Unschön wirds so oder so, fürchte ich. Was für Operationen brauchst du alles? Wie ist denn GTKs
ListStoreimplementiert?
-
GTKs ListStore nutzt eigene C-Implementierungen, lässt sich so einfach also nicht auf C++ übertragen.
Operationen wären Hinzufügen, Iterieren und Löschen.
Ich habe es nun momentan so gelöst, dass ich die Typeninformationen zur Laufzeit spezifiziere, Beispiel:
store.AddColumn<int>(); store.AddColumn<string>();Intern werden die Typen über boost::any-Instanzen abgelegt, so dass ich mittels type() darauf prüfen kann. Ist sicher nicht die performanteste Lösung, anders herum aber wesentlich einfacher zu warten.
-
StefanBo schrieb:
GTKs ListStore nutzt eigene C-Implementierungen, lässt sich so einfach also nicht auf C++ übertragen.
Okay, ich hatte zuerst das Gefühl, GTK würde diese Templatesyntax anbieten. Aber es handelt sich ja um eine C-Bibliothek.
StefanBo schrieb:
Intern werden die Typen über boost::any-Instanzen abgelegt, so dass ich mittels type() darauf prüfen kann. Ist sicher nicht die performanteste Lösung, anders herum aber wesentlich einfacher zu warten.
Wichtiger als die Performance wäre mir die Typsicherheit, die du so nicht mehr hast, da du jetzt beliebige Typen einfügen kannst...