For me, that really is the edge that C++ holds over C.
For me, that really is the edge that C++ holds over C.
Polymorphism and "good generic data structures" (in the sense you are implying) are not a necessary requirement of elegant and maintainable code. It is part of the problem that programmers have taken OO concepts as the end-all of good code, and must apply those concepts everywhere even if that means implementing them from scratch at the cost of (unnecessary) complexity.
Large systems have been written in C. Many large open-source projects use C. There is no evidence that these are less maintainable (in general) because of language choices.
Some of these graft OO concepts onto C. GTK is noticeable for this (although it doesn't seem to be too bad for application developers, I'm afraid for those tasked to maintain the libraries themselves).
Procedural programming is not a sin (if "procedural programming" exists at all today, as most of the simplest object concepts have become common practice and are now though as an integral part of it).
As far as I know, there is no such 'old saying'.
However, The determined Real Programmer can write FORTRAN programs in any language.
I have an example. The Squid proxy code used calling via function pointers everywhere as DIY polymorphism. That made it quite difficult for me (ymmv) to follow the code.
Things like ctags would have worked if they'd used "real" C++ polymorphism.
IMHO. YMMV.
If from OO, I could have only Java-like interfaces, it would probably be enough. Implicit type conversions could also work I suppose.
Stroustrup discusses this here:
http://channel9.msdn.com/Events/GoingNative/GoingNative-2012...