Here is my view on how to do proper singletons (and other non-trivial static objects): https://github.com/alex4747-pub/proper_singleton
Summary:
- Use static initialization list to instantiate singletons at the right time: after entering main and before enabling multi-threading
- Add minor improvements to make it unit-test friendly.