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: пожалуйста, не делайте. Благодарю.

0 ответов

Другие вопросы по тегам