Infos über neuen C++-Standard? Thread Nr.2



  • Original erstellt von Lars:
    **Whats the sence of the possibility to overload the postfix operator?
    Why is the postfix operator not auto-implemented?
    That would has the advantage that compiler could optimize postfix-uses (even it
    is a mistake of the programmer, that he used the postfix one).
    **

    ich glaube das die sich ähnliche gedanken zu c++98 gemacht haben, es gibt bestimmt gute gründe wieso man die postfix version überladen darf.
    Aber mir kann eine änderung sowieso egal sein, wie oft überlade ich den, den op++?
    und mit meiner eselsbrücke langammer postfix == häslicher int dummy kann ich mir das relativ leicht merken



  • Original erstellt von Dimah:
    **
    ich glaube das die sich ähnliche gedanken zu c++98 gemacht haben, es gibt bestimmt gute gründe wieso man die postfix version überladen darf.
    Aber mir kann eine änderung sowieso egal sein, wie oft überlade ich den, den op++?
    und mit meiner eselsbrücke langammer postfix == häslicher int dummy kann ich mir das relativ leicht merken**

    Es geht ja gar nicht um Lesbarkeit oder Hässlichkeit des int-dummys, sondern um Redudanz und Optimierung. Ich hab folgende Antwort erhalten:

    One could say something similar about operator + and operator += :
    class Example
    {
    public:
       Example& operator += (const Example& other)
       {  // implementation
          return *this;
       }
    
       Example operator + (const Example& other) const
       {
          Example temp(*this);
          temp+=other;
          return temp;
       }
    };
    
    and perhaps more examples; if you allow me, let me generalize your
    proposition by using some directive to let the compiler know : "I want
    this method: auto-implement it", for example with the already existent
    'auto' keyword.
    
    An 'auto-implementation' table should be standarized (i.e. saying:
    method    auto-implemented using
    ------    ----------------------------
    ++(int)   ++()
    +         +=
    ...       ...
    
    and a standard auto-implementation for each one (left column).
    
    Your example would look like:
    
    class Example
    {
    public:
       Example& operator += (const Example& other)
       {  // implementation
          return *this;
       }
    
       auto Example operator + (const Example& other) const;
    
       Example& operator ++ ()
       {  /* your example */ }
    
       auto Example operator ++(int);
    };
    
    I think this is important in terms of optimization and readability (as
    far as the client 'see' that some operator is auto-implemented).
    
     Daniel.
    

    genau das halt ich auch für sinnvoll



  • Hallo,
    hat jetzt eigentlich schon jemand ein Vorschlag für ein foreach ohne typeof gemacht?

    Wenn nein, hier meiner:

    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_ = (void*)new  iter(cont.begin());
        }
    };
    
    #define FOREACH(var, cont) for (ForEachHelper b(cont) ; b.assign(var,cont);)
    

    Anwendung:

    vector<int> vec;
    vec.push_back(6);
    vec.push_back(5);
    vec.push_back(4);
    int n;
    FOREACH(n, vec)
    {
        cout << n << endl;
    }
    set<string> s;
    s.insert("abc");
    s.insert("cde");
    s.insert("efg");
    string str;
    FOREACH(str, s)
    {
        cout << str << endl;
    }
    


  • lol, da hätte man eigentlich früher drauf kommen können. Statt den deklarierten Typ zu parametrisieren, einfach bei jeder Anwendung davon einen parametrisierten Cast benutzen

    nice 🙂



  • cur_ = (void*)new iter(cont.begin());

    Warum nimmst Du nen C-Style-Cast hier?
    Dass man seinen Iterator auf den Heap legen muss is performance-mäßig auch ein bisschen traurig.

    Aber ziehmlich cool eigentlich. Werd ich mal verwenden und mich vielleicht sogar dran gewöhnen 🙂



  • Warum nimmst Du nen C-Style-Cast hier?

    Um etwas Inkonsistenz reinzubringen und damit den Leser wach zu halten 😃

    Dass man seinen Iterator auf den Heap legen muss is performance-mäßig auch ein bisschen traurig

    Richtig. Das ist ein echter Nachteil. Allerdings lässt sich dieser zur Not auch umgehen. Man muss ja nur new passend überladen.



  • Was wird der nächste Standard beinhalten? Templatetypedefs?



  • *** schrieb:

    Was wird der nächste Standard beinhalten? Templatetypedefs?

    das wär mal was 👍

    //edit wow is der thread schon alt 😮



  • Wie wärs mal mit nem neuen Thread. Auf den ersten kann man leider schon nicht mehr zugreifen 😞

    Wie stehts eigentlich im Moment um C++0x? Welche Änderungen gibts? Ach, ich mach jetzt einfach nen neuen auf.



  • was beudetet eigentlich C++0x?



  • 0x steht für das Erscheinungsjahr.



  • *** schrieb:

    Was wird der nächste Standard beinhalten?

    Template-Parameter als friends deklarieren zu können



  • ness schrieb:

    *** schrieb:

    Was wird der nächste Standard beinhalten?

    Template-Parameter als friends deklarieren zu können

    auch sowas wie Hummes dirstream?



  • Weiß schon einer wann der neue Standard kommt? Kommt der schon im nächsten Jahr? Welche Compiler werden ihn unterstützen?



  • Wie wäre es denn, wenn du einfach mal den neuen Thread zu diesem Thema liest?
    http://www.c-plusplus.net/forum/viewtopic.php?t=97205


Anmelden zum Antworten