Здравствуйте, Alexander G, Вы писали:
AG>Имплементация в .cpp в зависимости от потребностей. Неплохо её запихнуть в глобальную переменную в неймспейс детейл:
Согласен. Лучше даже в unnamed, только тогда с отладкой туго...
AG>Т.к. статической инициализации редко достаточно, нужно как-то обеспечить динамическую инициализацию/финализацию.
Как показывает опыт, бывает несложно определить "время потребности" в таком singleton. Тогда достаточно пары простых методов — initialize/cleanup.
Но иногда всё таки требуется отложенная инициализация с многопоточностью и произвольным временем доступа (например, аллокаторы — никто не запрещает заполнять контейнер при инициализации статики, те же глобальные const std::string x = "xxx" и т.п.). Как я понял, универсального метода создания такого singleton нет, всё упирается в неатомарную инициализацию объектов синхронизации. Пока обхожусь такой вот конструкцией:
template<typename T>
class singleton
{
public:
static T& instance(){ if(!obj) static_init.initialize(); return *obj; }
private:
singleton() { if(!obj) initialize(); }
void initialize() { obj = new T; };
static T* obj;
static singleton static_init;
};
template<typename T> T* singleton<T>::obj = 0;
template<typename T> typename singleton<T> singleton<T>::static_init;
Всё вроде бы хорошо, кроме удаления — его попросту нет.