Подскажите, как называется приведённая ниже реализация синглтона? Какие есть недостатки в отличие от синглтона Маерса?
/* Файл Single.h
Класс не допускает наследование.
Нежелательно динамическое размещение (assert'ы как раз из-за этого =).
Создаётся только один экземпляр CBase.
Не требует инстанциирования шаблона.
Не поддерживает многопточность.
CBase должен иметь конструктор без параметров.
*/
template <class CBase>
class CSingle
{
public:
CSingle() : pcache(single.instance()) {}
CBase* operator ->()
{
return pcache;
}
~CSingle() { single.release(); }
private:
CBase* pcache;
template<CBase>
class CSingleImpl // Введён для упрощения инстанциирования
{
public:
CSingleImpl() : pn(0),px(0) {}
CBase* instance()
{
if(!pn) px=new CBase();
pn++;
}
void release()
{
assert(pn>=0); // Поможет отловить утечки
pn--;
if(!pn) delete px;
}
~CSingleImpl() {assert(!pn);} // Поможет отловить утечки
private:
int pn;
CBase* px;
};
typedef CSingleImpl<CBase> tSingle;
static tSingle single;
};
template CSingle<CBase>::tSingle single;