Я бы использовал синглтон вот так:
Singleton* single = Singleton::instance();
single->do_it();
Я бы использовал такой безымянный класс:
single.do_it();
Мне кажется, что шаблон Singleton не имеет никакого преимущества над неназванным классом, кроме наличия читаемых сообщений об ошибках. Использование синглетонов неудобнее, чем использование безымянного объекта класса: во-первых, клиенты должны сначала получить дескриптор экземпляра; во-вторых, разработчику Singleton::instance()
может потребоваться учитывать параллелизм.
Так почему и как бы вы выбрали синглтон вместо безымянного класса?
В качестве дополнения, хотя очевидное определение неназванного класса может быть
class {
// ...
}single;
Я мог бы также определить это так:
#ifndef NDEBUG
class Singleton__ { // readable error messages,
#else
class { // unnamed, clients can't instantiate
#endif
// ...
}single;
с последним подходом, который имеет преимущество читаемых сообщений об ошибках компилятора, но не является одиночным в режиме отладки.