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 mich

    template<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.


Anmelden zum Antworten