Re[3]: Синглтон через умный указатель
От: sokel Россия  
Дата: 10.03.09 09:27
Оценка:
Здравствуйте, 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;


Всё вроде бы хорошо, кроме удаления — его попросту нет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.