C++: применять Singleton на подклассах ABC
В уже существующей платформе Simulation я пытаюсь реализовать шаблон состояния для уже существующих абстрактных базовых классов моделей. Так как класс модели - это только ABC, то должны быть и состояния. Я ищу способ применения шаблона синглтона на всех возможных дочерних классах ABC состояний.
Вот что я попробовал до сих пор:
template<typename T> class SingletonBase
{
public:
[...]
static T* getInstance()
{
if (instance == nullptr)
{
instance = new T();
}
return instance;
}
protected:
SingletonBase(){}
static T* instance;
Вот азбука моего государства:
template <typename A, typename B, typename StateType>
class State : public SingletonBase<StateType>
{
public:
virtual ~State(){}
virtual void foo(Context<A,B,StateType>* ctx, ...) = 0;
virtual void bar(Context<A,B,StateType>* ctc, ...) = 0;
protected:
State(){}
virtual void changeState(Context<A, B, StateType>* ctx, State<A, B, StateType>* state);
private:
friend class SingletonBase<State<A, B, StateType>>;
};
Класс контекста принимает те же три параметра шаблона, что и для определения типа его состояния. И новые шаблоны классов наконец-то наследуют от Context и ABC используемых моделей.
Теперь я попытался создать базовый класс для конкретных состояний, используя в симуляции следующий способ (этот базовый класс необходим, чтобы все Context имели одинаковый тип):
class StateBaseForSimulationScenario : public State<foobar, barfoo, StateBaseForSimulationScenario>
Теперь я сталкиваюсь с двумя проблемами:
1) Очевидно, что метод getInstance() каждого дочернего элемента базы состояния будет генерировать только базу состояний
2) Если я вместо использования типа базы состояния в качестве параметра шаблона использую конкретный тип, контекст не будет совпадать (например, контекст с параметром StateIdle явно не совпадает с типом контекста с параметром StateProroduction)
Итак, мой вопрос: есть ли способ заставить все будущие дочерние классы State быть Singleton? Или это просто невозможно в C++?
PS: Если вы ответили, что Sigletons - это анти-паттерн / плохой дизайн и т. Д. Или что я просто должен использовать boost: пожалуйста, не делайте. Благодарю.