Warum gibt es kein std::tr1::array<T> operator +=



  • oparator schrieb:

    Mir fällt gerade auf dass dieses valarray keine feste Größe hat 😞

    Dann schreib die freie Operatoren für das array .



  • hustbaer schrieb:

    oparator schrieb:

    Ist dieses Array synchronisiert?

    Was soll synchronisiert in dem Zusammenhang bedeuten?

    Thread Safe.



  • oparator schrieb:

    SeppJ schrieb:

    Weil es das alles schon anderswo gibt:
    http://www.cplusplus.com/reference/std/valarray/

    Mir fällt gerade auf dass dieses valarray keine feste Größe hat 😞

    Schreib einen Wrapper, der valarray implementiert.

    template< class T, size_t N > 
    class const_valarray : private valarray<T> {
      // bitte selbst ausfüllen
    };
    

    Und lasse nur die Memberfunctions zu, die das valarray nicht in der Größe ändern können.



  • oparator schrieb:

    Geht irgendwie nicht. Hat es einen Grund?

    Davon abgesehen, warum sollte es den einen operator += für einen generischen Container geben, und wie sollte dieser interpretiert werden?

    Ich würde nicht unbedingt mit "+=" zwischen zwei Containern erwarten, das die Elemente paarweise addiert werden. Genauso gut könnte man sagen das += einen Container um den Inhalt eines weiteren erweitert...

    Zudem: Was sollte z.B. in diesem Fall passieren:

    std::tr1::array a1<3, person> personen1;
    std::tr1::array a2<3, person> personen2;
    a1 += a2;
    

    Operatoren sind nicht selten nur im konkreten Kontext sinnvoll.



  • Artchi schrieb:

    Schreib einen Wrapper, der valarray implementiert.

    template< class T, size_t N > 
    class const_valarray : private valarray<T> {
      // bitte selbst ausfüllen
    };
    

    Und lasse nur die Memberfunctions zu, die das valarray nicht in der Größe ändern können.

    Was spricht in diesem Fall für private Vererbung? Wieso nicht Aggregation?



  • Nexus schrieb:

    Was spricht in diesem Fall für private Vererbung?

    Werden STD-Adapter nicht auch private Vererbt?



  • Wonach du zu suchen scheinst ist so etwas wie Eigen oder Boost.uBLAS (wenn die Vektoren groß sind).

    oparator schrieb:

    hustbaer schrieb:

    oparator schrieb:

    Ist dieses Array synchronisiert?

    Was soll synchronisiert in dem Zusammenhang bedeuten?

    Thread Safe.

    Nein. Darum musst du dich kümmern.



  • oparator schrieb:

    hustbaer schrieb:

    oparator schrieb:

    Ist dieses Array synchronisiert?

    Was soll synchronisiert in dem Zusammenhang bedeuten?

    Thread Safe.

    Soll das ein Scherz sein?

    Wieso sollten da irgendwas thread-safe sein?

    Ist denn irgendwas in der SCL thread-safe - mal abgesehen von globalen Funktionen und atomic/thread/mutex/condition_variable?



  • Dank eurer Hilfe habe bin ich gut vorangekommen und verwende nun das valarray.

    An einer Stelle ist mir ein Fehler? aufgefallen den ich nicht so deuten kann.

    Hier ist der Code:

    double operator [](const unsigned int &b)
    {
    	if(b == 0)
    	{
    		return (this)[0][0];
    	}
    	else if(b == 1)
    	{
    		return (this)[0][1];
    	}
    
    	assert(false);
    
    	return 0.0;
    }
    
    double distance(position2d &b) const
    {
    	return hypot((*this)[0]-b[0],(*this)[1]-b[1]);
    }
    

    Ist es richtig dass der Compiler mir nicht meckert dass ich bei operator keine const & zurückgebe? in der distance funktion meckert er nämlich über den const qualifier wenn ich auf b[0] zugreifen möchte.



  • oparator schrieb:

    in der distance funktion meckert er nämlich über den const qualifier wenn ich auf b[0] zugreifen möchte.

    Wenn ich es so verwende
    [cpp]
    double distance(const position3d &b) const
    [/cpp]
    meckert der compiler.

    Error: no operator "[]" matches these operands
    


  • Klar meckert er, weil dein operator [] nicht auf const Objekte aufgerufen werden kann.

    //double operator [](const unsigned int &b)
    double operator [](unsigned int index) const
    {
    // ...
    


  • hustbaer schrieb:

    Klar meckert er, weil dein operator [] nicht auf const Objekte aufgerufen werden kann.

    //double operator [](const unsigned int &b)
    double operator [](unsigned int index) const
    {
    // ...
    

    Also braucht man zwei gleiche Operatoren mit const und nicht const einmal für den Zugriff einmal fürs schreiben?

    double operator [](unsigned int index) const
    

    Damit kann ich doch nicht

    test[0] = 2.0;
    

    ??



  • man macht normalerweise folgendes:

    double & operator[](unsigned int x) {}
    const double & operator(unsigned int x) const {}
    

    mit dem ersten greift man drauf zu und mit dem zweiten hat man eine lvalue referenz, die man auch belegen kann



  • richtig, da brauchst du zwei Operatoren - der konstante liefert einen double, der "normale" eine Referenz (damit die Zuweisung auch funktioniert).



  • CStoll schrieb:

    richtig, da brauchst du zwei Operatoren - der konstante liefert einen double, der "normale" eine Referenz (damit die Zuweisung auch funktioniert).

    Danke an alle Helfenden.


Anmelden zum Antworten