typeof
-
hi
vc++7 hat doch kein typeof operator, mit dem ich das:
int i; typeof(i) j;
machen kann, oder?
also hab ich versucht, das zu simulieren, weil es bei einigen macros ziemlich hilfreich waere.
warum laesst michtemplate<typename T>struct Type{ typedef T get; }; template<typename T>Type<T> typeof(T x){ return Type<T>(); }
zwar
int i; Type<int> ti = typeof(i); Type<int>::get k;
nicht jedoch, wie ich es gerne haette,
typeof(i)::get j;
schreiben?
-
typeof(i) liefert dir ein objekt.
und auf nem objekt kannste nicht :: machen.ps: bin interessiert, falls du ein brauchbares foreach schaffst.
-
ja, ich habs schon gemerkt, wenn das ginge, haette ich das problem gar nicht, weil ich dann ::iterator gleich auf das objekt anwenden koennte.
gibts da keine moeglichkeit, entweder standardgemaess oder mit visual extensions?
gibt es plaene von microsoft, ein typeof zu machen?der hier http://www.informit.com/isapi/product_id~%7B0D1BD3B4-0DC4-4D74-BF0F-4619E0DC1D26%7D/content/index.asp
schlaegt eins vor, gefaellt mir aber nicht so. da mach ich vermutlich eher eins, wo man den iteratortyp mit uebergibt oder ich lass es bleiben.
-
ps: bin interessiert, falls du ein brauchbares foreach schaffst.
Was genau war an meinem nicht brauchbar? Die dynamische Allokation?
-
Stephen Dewhurst hat mal in einer Artikelserie im CUJ einen typeof-Operator implementiert. Leider gibt's die Artikel nicht online. Den Quellcode gibt's aber sowohl auf seiner HP, als auch im CUJ-Archive.
-
Original erstellt von HumeSikkins:
Was genau war an meinem nicht brauchbar? Die dynamische Allokation?ka. hab ich deinen gesehen?
-
ka. hab ich deinen gesehen?
Ich habe den Code auf jeden Fall schonmal gepostet.
Sah etwa so aus:struct ForEachHelper { void* cur_; template <class T, class U> bool assign (T& r, U& c) { typedef typename U::iterator iter; if (*static_cast<iter*>(cur_) != c.end()) { r = **static_cast<iter*>(cur_); ++*static_cast<iter*>(cur_); return true; } delete static_cast<iter*>(cur_); return false; } template <class U> ForEachHelper(U& cont) { typedef typename U::iterator iter; cur_ = static_cast<void*>(new iter(cont.begin())); } }; #define FOR_EACH(var, cont) for (ForEachHelper b(cont) ; b.assign(var,cont);) #include <vector> #include <iostream> #include <set> #include <string> using namespace std; int main() { vector<int> vec; vec.push_back(6); vec.push_back(5); vec.push_back(4); int n; FOR_EACH(n, vec) { cout << n << endl; } set<string> aSet; aSet.insert("Hallo"); aSet.insert("Welt"); string s; FOR_EACH(s, aSet) { cout << s << endl; } }
Naja, mir gefällt das ganze mittlerweile aber nicht mehr
-
ok. sehe, wie du die problemchen umgangen hast. naja, einsetzen würde ich den nicht gerne. *g*
aber hast die problemchen ganz hübsch umschifft.