Reputation: 16256
What do you think about an imaginary possibility to specify user-defined operators in C++.
Such user-defined operator could be defined by operator name (arbitrary sequence of allowed chars?), its precedence, associativity and arity (something else?).
They could be used for many purposes: to help to build "tiny" DSLs over C++, for list comprehension etc.
Wouldn't this feature extend the language possible usage? What are other languages that allow user-defined operators? Lisp comes to mind, anything else? Any links about the topic?
Upvotes: 5
Views: 3791
Reputation: 31435
So let's say you define ** to mean "to the power of" as a user-operator.
Now you have some code like this:
double d1 = 2.5;
double *pd1 = &d1;
double d2 = 3.0**pd1;
Without the "operator **" the code above is actually legal, it is parsed as 3.0 * (*pd1)
(and the result is 7.5)
Is the compiler going to know whether the ** is as above or trying to do a "power" (and complain that the right hand side is a pointer).
Having said that I do think &&=
and ||=
and even ^^
and ^^=
should be added as operators. (I don't think ^^ is logical xor, giving a true if exactly one of the expressions is non-zero).
Upvotes: 1
Reputation: 25680
Well, Haskell has custom operators with settable precedence and left-right binding. So, it can work. But then, Haskell is cutting edge and barely readable as is, even though it's mostly used by some rather clever people. (Haskell scares off all newbies, I think..)
For C++, I think there are:
std::vector<std::list<int>>
bug, where >>
was parsed as the right-shift operator) .. C++'s syntax is hard enough as is.The latter one is the dealbreaker, IMO.
Nevertheless, nothing is stopping you from writing a c++-preprocessor/parser that replaces your own-defined operators with real function calls and then uses the normal c++ compiler (like how c++ was built on C previously). Would be a neat experiment, if you'd keep your sanity long enough to ship. ;-)
Upvotes: 5
Reputation: 222973
Well, you know, Bjarne Stroustrup did propose such a thing...Generalizing Overloading for C++2000. :-P :-P :-P
Upvotes: 7
Reputation: 26597
I fail to understand the advantage of such operators. Functions and methods are sufficient for every kind of use I can think of.
I think such a possibility would only make C++ a lot more complex and reduce readability of sources. Operators overriding is already such a mess in some sources that I can't imagine what some people would do with operators definition...
BTW, I really don't understand what you mean by "tiny DNSs over C++"
Upvotes: 1
Reputation: 107686
You may be mixing concepts - user defined operator overloads are ok. This is because the compiler already knows the syntax rules for C++ defined operators.
User defined operators "per se" - no. Imagine being able to make the word "Klingon" an operator - how will it differentiate between operator and variable?
Upvotes: 0