The library {fmt} (http://fmtlib.net/latest/index.html) is on track to be included in the standard.
One thing that drives me crazy about C++ is that if you incorporate a few different third-party libraries you often end up writing a few different DSLs. Everyone has their own subset of operator overloads that do different things in different contexts and you just have to remember which one does what based on your receiver type -- which is often 'auto' these days anyways. It's maddening. Worse still, the STL plays this game. Time to move on.
There are lots of cases where overriding operators makes sense and is intuitive to the reader, for instance when you are dealing with monoids, groups or rings.
fmt::memory_buffer out1;
std::ostream out2 = std::cout;
auto out3 = printer(stream);
auto out4 = my_printer();
format_to(out1, ...)
out2 << "Hi..."
out3.print(5);
out3 += 6;
These all do the same but it's a total mess. #include <fmt/ranges.h>
std::vector<int> v = {1, 2, 3};
fmt::print("{}", v); // prints {1, 2, 3}Looks like it's now public as a part of Abseil: https://github.com/abseil/abseil-cpp/blob/bf29470384a101b307...