operator,
-
Zdravko schrieb:
LordJaxom schrieb:
Zdravko schrieb:
Nein, der Komma-Operator kann man nicht überladen.
Man kann schon.
Seit wann ist es so?
Schon immer bzw. ungefähr solange wie man überhaupt in C++ Operatoren überladen kann.
-
Bashar schrieb:
Zdravko schrieb:
LordJaxom schrieb:
Zdravko schrieb:
Nein, der Komma-Operator kann man nicht überladen.
Man kann schon.
Seit wann ist es so?
Schon immer bzw. ungefähr solange wie man überhaupt in C++ Operatoren überladen kann.
Im Prinzip hast du Recht:
11.2 Operator Functions [over.oper]
Functions defining meanings for the following operators (§6.2) can be declared:
+ *
/ % ^ &
| ~ ! = < > +=*= /= %= ^= &= |=
<< >> >>= <<= == != <== && || ++ >*
,[] () new new[] delete delete[]
The following operators cannot be defined by a user:
:: (scope resolution; §4.9.4, §10.2.4),
. (member selection; §5.7), and
.* (member selection through pointer to function; §15.5).Aber dann kann man noch lesen:
Because of historical accident, the operators = (assignment), & (addressof),
and , (sequencing;
§6.2.2) have predefined meanings when applied to class objects. These predefined meanings can
be made inaccessible to general users by making them private:
c l a s s X {
p r i v a t e :
v o i d o p e r a t o r =(c o n s t X &);
v o i d o p e r a t o r &();
v o i d o p e r a t o r ,(c o n s t X &);
/ / ...
};
Section 11.2.2 Predefined Meanings for Operators 265
v o i d f (X a ,X b )
{
a = b; / / error: operator= private
&a ; // error: operator& private
a ,b ; // error: operator, private
}
Alternatively, they can be given new meanings by suitable definitions.Kann mir jemand jetzt ein Beispiel geben, wo , als Überladener Operator benutzt wird?
-
Zdravko schrieb:
Im Prinzip hast du Recht:
Wieso im Prinzip?
Kann mir jemand jetzt ein Beispiel geben, wo , als Überladener Operator benutzt wird?
-
boost::lambda benutzt den operator, ebenfalls als Ersatz für das Semikolon (in lambda-funktionen)
-
boost::assign nutzt den operator um listen aus objekten zu erzeugen.
-
Hmmmmm,
ich weiß nicht, ob ich das überhaupt in Erwägung ziehen würde....
Bekommt man eigentlich bei sowas Mehrdeutigkeiten:struct A { A operator,(A, A); } void f(A); void f(A, A); int main() { A a1, a2; f(a1, a2); ...??
Oder gibt's da einen "eingebauten Vorrang" ?
Immerhin könnte man sonst damit doch "typsichere variable Argumentlisten" bauen, oder ?Gruß,
Simon2,
-
Da gibt's einen eingebauten Vorrang - das Trennzeichen in Argumentlisten ist nicht dein operator, (genauso wenig wie das Trennzeichen zwischen Variablendeklarationen).
-
Luabind (http://www.rasterbar.com/products/luabind.html) verwendet den , Operator auch:
module(L) [ def("f", (int(*)(const char*)) &f), def("f", (void(*)(int)) &f) ];Außerdem kann man mit den "," Operator mehrere Anweisungen in einer Zeile unterbringen. Falls man das irgendwann mal von nöten sein sollte:
#define gl_call( func ) ( func ), assert( glGetError() == GL_NO_ERROR && #func )
-
Zu guter Letzt noch: Boost.Spirit überlädt 'op,', um einen ähnlichen Effekt wie bei Boost.Assign für die Initialisierung von Symboltabellen zu erzielen.
Und zu guter Letzt: *ich* überlade ihn, wenn ich Funktionen mit einer variablen Anzahl an Parametern benötige, denn 'va_args' ist mir suspekt. (Aber zugegeben: In der Praxis habe ich in C++ noch nie variable Parameteranzahlen benötigt).
-
CStoll schrieb:
Da gibt's einen eingebauten Vorrang - das Trennzeichen in Argumentlisten ist nicht dein operator, (genauso wenig wie das Trennzeichen zwischen Variablendeklarationen).
OK, vielen Dank,
Simon2,