I know this has been asked before, but I'm coming at it as an experienced developer so perhaps the advice is different.
I've been programming professionally for 15 years, the last 7 or 8 in C++ and C#. I consider myself pretty good at both of them, but I look at how real gurus utilize the language and it is humbling, to say the least.
I came from a C background initially, so my C++ is often a blend (best case) of C and C++, which bothers me from multiple points of view. Part of my problem in solving this is not having a clear set of guidelines to work from. (Another part of the problem is the shortest-path problem; it's hard on a deadline to force the right style over function.)
So what are some good guidelines for a more experienced programmer? I feel like I have a strong handle on most of the STL and on some bits of Boost. I'm a bad template programmer (and thinker). I don't have any clear methodology around exception handling-- I often prefer return codes over throwing exceptions. I haven't really embraced RAII which leads to occasional resource leak issues. I have mostly eschewed smart pointers but feel like I'm really missing out.
How do I make the next jump from competent-but-not-very-pretty programmer to a better structured one in C++? What rules do you force yourself to follow to avoid falling into comfortable shortcuts/ruts?