template typedef
-
Hallo,
wie kann ich sowas in der Art verwirklichen?typedef std::vector<T> MyVector<T>; // oder typedef std::vector MyVector;Muss ich dafür ein Makro nehmen, oder kann ich das irgendwie mit einem typedef lösen?
-
Template typedefs gibt's nicht in C++. Aber im neuen Standard wird's voraussichtlich drin sein, vielleicht kann's dein Compiler schon mit den richtigen Schaltern.. Bis dahin ist dies der übliche Workaround:
#include <vector> template<class T> struct MyVector { typedef std::vector<T> Type; }; int main() { MyVector<int>::Type foo; }Für C++0x, guckst du hier:
http://en.wikipedia.org/wiki/C%2B%2B0x#Template_aliases
Ob dein Compiler das kann und wenn ja wie, guckste bei Google.
-
Soweit man google glauben kann, wird dieses Feature weder im GCC noch beim MSVC unterstützt. Und das Workaround vermehrt die Tipparbeit ja sogar manchmal

Ich habe jetzt einfach ein Makro genommen, ist zwar nicht so schön, aber erfüllt seinen Zweck besser.
-
Du machst den Typedef nur zum Sparen von Tipparbeit?
Dann mach doch using std::vectorund du hast nur 5 Buchstaben.
-
SeppJ schrieb:
Template typedefs gibt's nicht in C++. Aber im neuen Standard wird's voraussichtlich drin sein
Cool...
Das wußte ich auch noch nicht
Leider unterstützt selbst die Version 4.7 des GCC es leider noch nicht:
http://gcc.gnu.org/gcc-4.7/cxx0x_status.html
-
XSpille schrieb:
Leider unterstützt selbst die Version 4.7 des GCC es leider noch nicht:
http://gcc.gnu.org/gcc-4.7/cxx0x_status.htmlAnscheinend aber in einem seperaten Patch.
Wenns nur für dich ist, teste den doch mal.
-
SeppJ schrieb:
Du machst den Typedef nur zum Sparen von Tipparbeit?
Dann mach doch using std::vectorund du hast nur 5 Buchstaben.Ne ich möchte nur aus einem _irgendein_typ_nochwas_t<T> ein MeinTyp<T> machen

-
Das bietet doch der obige Workaround. Die Namen kannste so kurz wählen wie du möchtest. Z.B.
Mein<int>::Typeoder_<int>::_:p
-
Templamator schrieb:
Hallo,
wie kann ich sowas in der Art verwirklichen?typedef std::vector<T> MyVector<T>; // oder typedef std::vector MyVector;Im Moment gar nicht. Später soll das dann mal so aussehen:
using MyReal = double; // alternativ: typedef double MyReal; template<class T> using MyVector = std::vector<T>; // geht nicht andersIch habe gehört, dass das Clang schon kann.
-
krümelkacker schrieb:
Ich habe gehört, dass das Clang schon kann.
Nicht laut dem hier: http://wiki.apache.org/stdcxx/C++0xCompilerSupport
-
meistens geht auch
template<class T> struct MyVector:public std::vector<T>{}; int main() { MyVector<int> foo; }Kommt drauf an in welchem Umfeld sich dein Typ befindet.
-
otze schrieb:
meistens geht auch [...]
Und meistens ist das ein schmutziger Hack, den die paar Zeichen, die man dadurch weniger tippen muss, nicht rechtfertigen.
-
Ethon schrieb:
krümelkacker schrieb:
Ich habe gehört, dass das Clang schon kann.
Nicht laut dem hier: http://wiki.apache.org/stdcxx/C++0xCompilerSupport
Dieser Seite schenke in, was Clang angeht, weniger vertrauen als der hier:
http://clang.llvm.org/cxx_status.html

-
Diesen Hack nutzt QT aber auch ständig. Nämlich, wenn eine Klasse außerhalb dessen auch im Namespace landen soll. Dort gibt es aber keine Klassentemplates, weswegen das eigentlich seltsam ist.
-
pumuckl schrieb:
otze schrieb:
meistens geht auch [...]
Und meistens ist das ein schmutziger Hack, den die paar Zeichen, die man dadurch weniger tippen muss, nicht rechtfertigen.
Ja. Hat aber den Vorteil, dass es an vielen Stellen zu lesbareren Compilerfehlermeldungen führt.
-
Ach Compilerfehlermeldungen find ich überbewertet. Ich meine, wenn da ein 16-Zeiler an Templatemeldungen erscheint, geh ich ans Ende und bin auch sofort da.
-
otze schrieb:
Ja. Hat aber den Vorteil, dass es an vielen Stellen zu lesbareren Compilerfehlermeldungen führt.
Nö, es fügt nur eine zusätzliche Zeile in den Template-Fehlerstack ein. Und potentielle Fehler einzubauen, damit man Compilerfehler ein bisschen leichter entziffern kann ist nicht wirklich ein Grund, oder?

-
Aber was ist der Nachteil an diesem Hack?
-
Eisflamme schrieb:
Aber was ist der Nachteil an diesem Hack?
Dass Klassen wie z.B. std::vector nicht als Basisklassen vorgesehen sind und daher auch keine Rücksicht auf etwaige Kindklassen nehmen. Grundsätzlich sollte man Dinge nicht für etwas benutzen, wofür sie nicht vorgesehen sind, da es sonst eben unvorhersehbare Fehler geben kann. Und dann ist das ein klarer Fall von "selber Schuld" und man steht allein im Regen.
Selbst wenn das für die viele Klassentemplates ein sehr kleines Risiko ist, wozu es eingehen, wenn man gegenüber den Alternativen keinen nennenswerten Gewinn davon hat? Zumal solche Dinge zwar auf den ersten Blick die Schreibarbeit und meinetwegen auch das Lesen von Compilerfehlern erleichtern, andererseits aber die Wartbarkeit vermindern, weil der Kollege, der sich den Mist in 3 Monaten anschaut, sich erstmal am Kopf kratzt und sich fragt warum zum Henker man sowas unübliches gemacht hat und nach dem Clou dahinter sucht, der nicht existiert.
-
Okay, okay, bin überzeugt.
