With a bit of fiddeling you can use every kind of bracket to basically make function calls in c++
Here are the links to the snippets, all compile and run
Rust: https://godbolt.org/z/bM3d7bG14
Funny that you put rust as the “uses parenthesis for function calls”. When in rust you can use any bracket for macro invocations:
let v1 = vec!(1,2,3); let v2 = vec![1,2,3]; let v3 = vec!{1,2,3};These are valid and have the exact same meaning.
Good meme, but I’m really not sure why you wrapped everything in asserts which kind of ruins the aesthetics. IMO would have worked better as e.g.:
x = sum(1, 2, 3); // x = 6cpp and their operator overloads are also insane. It makes understanding cpp code impossible. A “+” could actually do something completely different or have insane side-effects. Truly superior language for spreading confusion.
Operator overloads is something that sounds like a good idea until you experience them firsthand. Just properly name your functions for fuck’s sake.
Honestly, I’m glad to have them, it can make a number of things simpler. For instance, a program I wrote had a number of duration fields that had to be stored in XML files and updated every once in a while. It was something that had to occur very often in the code: add a value to the duration, set that value in the XML data, and save the XML file. So I created a class that stored the date/time value and a pointer the XML element (it could be assumed that nothing else would be changing the value in the XML file and if it did, then that change should be overwritten) and overloaded the
+=operator (among others), so then all I needed was to create theDurationFieldobject, and then I could godurationFieldX += time2 - time1for instance. I could abstract all the logic away and make it very clear and easy to write. Could I have made it so that I have to todurationFieldX.add(time2 - time1)? Of course I could have. But IMO that variant is less neat and less readable.I’ll jump on your unpopular side. With a decent IDE you should be able to point/click and decode what any operator is doing in any context. If I have two vectors, or quaternions, and I want to operate on them, why should I be forced to pass them to a standard function instead of clearly seeing what I’m doing. If you can’t be bothered to know the types of your variables in a strongly typed language… IDK.
Yeah it’s like a knife, wildly superior to cut stuff up in the kitchen, but you can also like stick it in your eye (but why?).
I have honestly never seen parentheses called “round brackets” before. It totally makes sense, I have no idea why it’s not used more often.
“round brackets” sounds pretty hilarious
I wasn’t sure which word to use so wikipedia to the rescue https://en.wikipedia.org/wiki/Bracket
Only one of those is a function, get it right. () Call functions <> Specialize Templates, can be used to do compile time calls to things that behave like functions. [] Accesses elements {} Calls constructors, aka functions that do the initial setup.
Overloading these to do something else gets you in the naughty corner.
Edit: the implementation of the {} fuckery is no great. Just save the sum instead of all numbers.
Good point regarding the {} implementation.
I disagree slightly regarding your point that these aren’t function calls. Yes technically they are different things but effectively they are functions, I cann pass arguments and get a result based on some operations.
Of course not all of these can do anything but only the constexpr value is actually pretty limited. The other ones are straight up functions
You can do most if not all of this in Perl if you’re twisted enough. Some hoop jumping may be required*, but I can think of ways to do something that looks like each of these.
*: The braces are especially tricky if warnings are turned on. I’d probably abuse the deprecated multidimensional syntax and
tiea hash to the actual function.I haven’t kept up to date with C++ development in the last 16 years, I only recognize the first two of those four.
You can overload the indexing operazor “[]” (std::vector does this for example), and since c++23 this operator can have more than one argument.
The last one is a constructor call with an overloaded conversion operator. The {} syntax is possible since c++11 I think. The conversion operator was already available before that
Yeah sameish, normal and template?




