Generics How-To ?
-
GPC schrieb:
Ähm, sieht etwas schräg aus... was macht das where da hinten? Sagt das aus, dass diese Methode nur für Typen erlaubt ist, die man per DCtor erstellen kann?
ja. mit where definiert man constraints/concepts - also das interface dass die generics parameter unterstuetzen muessen.
java macht es so: <T extends Foo> wenn ich mich recht erinnere.
in C# geht es ueber where.
where T: Foo, new()das waere nun: muss von Foo erben und das new() constraint unterstuetzen - sprich einfach einen parameterlosen ctor anbieten.
-
Ah ja. Dank dir. Wird in dem Fall zur Laufzeit entschieden, ob's klappt oder nicht?!
-
GPC schrieb:
P.S. ist sowas mit Templates möglich?
Nein. [...]
Hm, okay, sorry. Schwach. Sehr schwach. Ein weiterer Grund, über die Templates zu lachen und Generics zu preisen :p
-
hehe, irgendwie wusste ich, dass du das schreiben würdest
-
GPC schrieb:
Ah ja. Dank dir. Wird in dem Fall zur Laufzeit entschieden, ob's klappt oder nicht?!
Nein, der Compiler kann ohne Probleme jeden Aufruf zur compile-Zeit prüfen.
Test test = Foo<Test>();
Jetzt schaut er nach ob Test einen default Konstruktor hat.
-
Optimizer schrieb:
GPC schrieb:
Ah ja. Dank dir. Wird in dem Fall zur Laufzeit entschieden, ob's klappt oder nicht?!
Nein, der Compiler kann ohne Probleme jeden Aufruf zur compile-Zeit prüfen.
Nimmt er diese Möglichkeit auch wahr?
Weil dann verstehe ich den Sinn der Constraints-Angabe nicht. Wenn wir mal von C++ ausgehen, wo es sowas nicht gibt, und ein T keinen DCtor hat, dann kompiliert das Teil einfach nicht, weil der Compiler halt den DCtor nicht findet. Wozu dann die Constraints-Geschichte?
-
GPC schrieb:
Weil dann verstehe ich den Sinn der Constraints-Angabe nicht. Wenn wir mal von C++ ausgehen, wo es sowas nicht gibt, und ein T keinen DCtor hat, dann kompiliert das Teil einfach nicht, weil der Compiler halt den DCtor nicht findet. Wozu dann die Constraints-Geschichte?
unabhaengig davon ob der c# compiler es wirklich immer zur compile time checken kann, ich weiss es nicht, schonmal eine c++ template fehlermeldung gesehen?
fuer alle leute die es nicht kennen, das ist von stlfilt geklaut:
d:\src\cl\demo>c++2 rtmap.cpp rtmap.cpp: In function `int main()': rtmap.cpp:19: invalid conversion from `int' to ` std::_Rb_tree_node<std::pair<const int, double> >*' rtmap.cpp:19: initializing argument 1 of `std::_Rb_tree_iterator<_Val, _Ref, _Ptr>::_Rb_tree_iterator(std::_Rb_tree_node<_Val>*) [with _Val = std::pair<const int, double>, _Ref = std::pair<const int, double>&, _Ptr = std::pair<const int, double>*]' rtmap.cpp:20: invalid conversion from `int' to ` std::_Rb_tree_node<std::pair<const int, double> >*' rtmap.cpp:20: initializing argument 1 of `std::_Rb_tree_iterator<_Val, _Ref, _Ptr>::_Rb_tree_iterator(std::_Rb_tree_node<_Val>*) [with _Val = std::pair<const int, double>, _Ref = std::pair<const int, double>&, _Ptr = std::pair<const int, double>*]' E:/GCC3/include/c++/3.2/bits/stl_tree.h: In member function `void std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::insert_unique(_II, _II) [with _InputIterator = int, _Key = int, _Val = std::pair<const int, double>, _KeyOfValue = std::_Select1st<std::pair<const int, double> >, _Compare = std::less<int>, _Alloc = std::allocator<std::pair<const int, double> >]': E:/GCC3/include/c++/3.2/bits/stl_map.h:272: instantiated from `void std::map<_ Key, _Tp, _Compare, _Alloc>::insert(_InputIterator, _InputIterator) [with _Input Iterator = int, _Key = int, _Tp = double, _Compare = std::less<int>, _Alloc = st d::allocator<std::pair<const int, double> >]' rtmap.cpp:21: instantiated from here E:/GCC3/include/c++/3.2/bits/stl_tree.h:1161: invalid type argument of `unary * '
wozu koennte man also constraints angeben koennen?
-
Shade Of Mine schrieb:
GPC schrieb:
Weil dann verstehe ich den Sinn der Constraints-Angabe nicht. Wenn wir mal von C++ ausgehen, wo es sowas nicht gibt, und ein T keinen DCtor hat, dann kompiliert das Teil einfach nicht, weil der Compiler halt den DCtor nicht findet. Wozu dann die Constraints-Geschichte?
unabhaengig davon ob der c# compiler es wirklich immer zur compile time checken kann, ich weiss es nicht, schonmal eine c++ template fehlermeldung gesehen?
Sicher, und? Nach nem halben Jahr Übung liest es sich flüssiger wie die BILD.
wozu koennte man also constraints angeben koennen?
Tjo, in dem Fall wohl um den Compiler-Output zu vereinfachen.
-
Eure Diskussion ist ja schön und gut, löst allerdings mein Problem nicht.
Wie müsste in diesem Fall der DCtor aussehen ?
-
GPC schrieb:
Tjo, in dem Fall wohl um den Compiler-Output zu vereinfachen.
Das und man kann in Java generische Klassen und Methoden als Binary weitergeben. Damit das dann funktionieren kann, braucht man sowas wie constraints, weil der Compiler hier mangels Sourcecode nicht einfach ein template instanzieren kann und schauen kann, ob es passt.
-
case schrieb:
Eure Diskussion ist ja schön und gut, löst allerdings mein Problem nicht.
Wie müsste in diesem Fall der DCtor aussehen ?Du müsstest Instanzen von T und U entgegennehmen, per Reflection zur Laufzeit ihren Typ bestimmen und ihre Konstruktoren aufrufen. Sowas wie new T() geht in Java nicht.