Warum gibt es kein std::tr1::array<T> operator +=
-
Hallo,
ich wollte gerade:
array<double,3> & array<double,3>::operator +=(const array<double,3>& b)Geht irgendwie nicht. Hat es einen Grund?
-
Gegenfrage: Was soll der denn machen? Mir ist das nämlich nicht so ganz klar.
-
möglicher weise möchte er sowas:
std::array<double, 3> a, b;
a += b;->
a[0] += b[0]
a[1] += b[1]
a[2] += b[2]also, dass alle elemente vom left hand side array mit den elementen des right hand side arrays addiert werden.
was logisch nur geht, wenn beide Arrays die gleiche Größe haben, was aber in seinem Beispiel durchaus gegeben ist.
-
SeppJ schrieb:
Gegenfrage: Was soll der denn machen? Mir ist das nämlich nicht so ganz klar.
Es sollte ohne code bloat so etwas funktionieren.
array<double,3> a,b; ... // Daten in a und b füllen. ... a += b; a -= b; a *= a;Man sollte damit also einfach addieren multiplizieren, quadrieren und subtrahieren können.
Gibt es Einwände warum man so etwas nicht machen sollte?
-
Weil es das alles schon anderswo gibt:
http://www.cplusplus.com/reference/std/valarray/
-
SeppJ schrieb:
Weil es das alles schon anderswo gibt:
http://www.cplusplus.com/reference/std/valarray/ok danke. das hilft super weiter.
Ist dieses Array synchronisiert?
-
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

-
oparator schrieb:
Ist dieses Array synchronisiert?
Was soll synchronisiert in dem Zusammenhang bedeuten?
-
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
privateVererbt?
-
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) constDamit kann ich doch nicht
test[0] = 2.0;??