Здравствуйте, Alxndr, Вы писали:
<>
Давай сперва без шаблонов обойдёмся. Маломало помечтаем...
Вариант №1
class abstract
{
public:
static abstract* instance();
.....
};
class concrete : public abstract
{
.....
};
test() { assert( dynamic_cast<concrete*>(abstract::instance()) != NULL ); }
Сразу возникает вопрос: а что, если есть несколько классов, concrete1...concreteN ? Что вернет abstract::instance() ?
Вариант №2
class abstract
{
.....
};
class concrete : public abstract
{
public:
static abstract* instance();
};
Здесь оказывается непринципиальным, унаследован ли concrete от abstract — на синглетонность это не влияет.
Что тебе больше нравится?
В первом случае мы имеем дело, по большому счёту, с фабричным методом (как минимум).
Финальный класс должен быть либо известен абстрактному заранее,
либо должен регистрировать себя (да ещё проверить — не нашлись ли иные претенденты)
— на стадии линковки (а не компиляции), а то и вообще в рантайме.