Variabler Tupel-Container
-
StefanBo schrieb:
Hehe, da habe ich meine Frage nicht präzise genug gestellt.

[...]
Im Grunde eine Liste mit beliebigen Tupel-Elementen, quasi:ListStore<int, string, char> store;Das ist nicht präziser als vorher.
Andrescus Buch kann ich nicht empfehlen. Ich hab's hier zwar auch rimliegen und fand es anfangs ganz nett, aber im Nachhinein erscheint's mir eher als überflüssig. Generisches Programmieren "policy-based design" zu nennen, fand ich jetzt auch nicht so spektakulär.
-
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.