Hacker News new | past | comments | ask | show | jobs | submit login
C++ named operators (github.com/klmr)
113 points by noobermin on Feb 2, 2015 | hide | past | favorite | 29 comments



I did much the same thing in Python a while ago: https://github.com/borntyping/python-infix



Very cool and elegant; thanks.


This is too clever to the point of being painful. (Not to mention, it has a performance penalty for no real benefit.)

I think I'd just give up and go home if I ever saw this in code I had to maintain.

EDIT: Actually, looking more closely, I guess there isn't a performance penalty (I saw back_inserter and assumed it was required for the implementation). That said, I still think it's far too clever.


Yes. This is fun, but FAR too clever. I can only speculate at the baffling compile errors... it doesn't bear thinking about. shudder


Gah. Nice idea, but the double-operator hack seems quite painful and error prone, especially with operators right in the middle of the precedence hierarchy.

This might be one of the few rare justifications for overloading the comma operator, for syntax similar to that of Haskell's backquote:

    arbitrary+expr ,foo, arbitrary-expr
Then the ,foo, would get processed last, letting the expressions evaluate first, which matches the semantics of Haskell's infixing backquotes (lowest precedence by default).

Even then, though, that would get ugly in a hurry when mixed with function calls, requiring parentheses for sanity.


operator, is one of the operators defining a sequence point (e.g. guaranteeing the left side of the expression executes in whole before the right - others being &&, ||, and ?:.)

Overloading the operator removes this sequence point. Too sketchy for my blood.

Some prior art: http://www.gamedev.net/blog/2/entry-19599-bad-code-here/


* is a better choice if you need something arithmetic-like, for instance

    vector3 a, b;
    float f = a *dot* b;
    vector3 c = a *cross* c;


Don't you need to overload two different operators to implement these named operators though?


No, they could equally well be two different overloads of a single operator.


MMh. You could also this syntax for generating HTML couldn't you ?



Imagine if somebody did this for regex!



I don't think I'm going to be able to sleep tonight.


Interesting ! thanks for the pointer !


Just promise you won't use it in production on the same continent as me ;)


LOL. Don't worry - I don't code in C++ atm.... but when I do have the opportunity to code C++ and need XML i will give it a try.


I don't think it would be as easy as what hamlet [1] looks like, since C++ doesn't have a notion of quasi quoting as far as I am aware, but it might be interesting.

[1]: http://www.yesodweb.com/book/shakespearean-templates


The following code is legal C++ and does exactly what you’d expect it to do.

auto result = "Hello" <repeat> 3 <join> ", ";

I had no idea what that might do. No expectations at all. Is this an attempt to write language X in language Y?


This is fully explained in the primary link if you read past the tl;dr section.


I think the point is that this isn't... necessarily idiomatic C++.


>I had no idea what that might do. No expectations at all.

Really? How is it any different than: "Hello".repeat(3).join(",");


Mostly because the order of operations is unclear. I read it as producing "HelloHelloHello, ". That is, repeat the previous thing three times and then concatenate that with the string ", ". It's surprising to me that "repeat" results in a new object with new semantics.


Depends on the language I guess.

I read it as "repeat the string Hello thrice and then add a comma and space". It's not really clear that "repeat" returns a list.

A C# equivalent would be:

     String.Join(", ", Enumerable.Repeat("Hello", 3))

Here it's easier to see that Repeat returns an Enumerable object.

Using an Extension Method, it's easy to see how someone could mistake the output:

https://ideone.com/DuIvZN


Does this increase the stack by 2 in every call?


It's a header-only library, so it should be inlined.


Terrible idea, terrible implementation, doesn't solve any actual problems...


Neither does your post. I suppose it was just written for fun or learning experience.




Consider applying for YC's Summer 2025 batch! Applications are open till May 13

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: