002
21.03.2011, 12:08 Uhr
0xdeadbeef
Gott (Operator)
|
Das geht schon - Boost.Assign macht ziemlich genau solche Dinge. Ich rate dir auch dringend dazu, Boost.Assign zu benutzen, wenn du diesen syntaktischen Zucker haben willst.
Grundsätzlich geht das über Proxy-Objekte. Kurz zusammengehackt etwa
C++: |
#include <cstddef> #include <iostream>
class vec3d_assignment_proxy;
struct vec3d { int data[3];
vec3d_assignment_proxy operator=(int x); };
class vec3d_assignment_proxy { public: vec3d_assignment_proxy(vec3d &self) : self_(self), index_(1) { }
vec3d_assignment_proxy &operator,(int val) { if(index_ >= 3) throw val; self_.data[index_] = val; ++index_;
return *this; }
private: vec3d &self_; std::size_t index_; };
vec3d_assignment_proxy vec3d::operator=(int x) { data[0] = x; return vec3d_assignment_proxy(*this); }
int main() { vec3d v;
v = 1,2,3;
std::cout << v.data[0] << ", " << v.data[1] << ", " << v.data[2] << std::endl; }
|
Wichtig bei der Überladung des Komma-Operators: Der Sequenzpunkt geht verloren! Komm nicht auf die Idee,
zu schreiben, das Verhalten ist dann undefiniert. Für den Compiler liest sich das wie ein geschachtelter Funktionsaufruf der Form
C++: |
operator,(operator,(operator=(v, x++), x++), x++);
|
-- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra |