Я написал класс со следующим статическим методом:
MyMap& Manager::GetMap( void )
{
static MyMap* factories = new MyMap();
return ( *factories );
}
Где "MyMap" - это typedef для:
unordered_map<string, function<Base* ( Dependency& d )>>
Существует также множество типов, производных от Base, например.
class Derived1 : public Base
{
public:
Derived1( Dependency& d );
};
Рассмотрим следующее использование.
Я определяю следующее в файле реализации для Derived1:
#include "Derived1.h"
#include "Manager.h"
int RegisterDerived1( void )
{
Manager::GetMap()["Test"] = []( Dependency& d ){ return new Derived1( d ); };
return 0;
}
int Reg = RegisterDerived1();
Вы не можете вызывать функции в области файла, но вы можете присвоить возвращаемое значение функции глобальной переменной, даже если эта функция имеет побочные эффекты. Следовательно, к тому времени, когда «Менеджер» будет использоваться, «Моя карта» будет содержать пары строк/функций для различных производных типов «Базы» (пока что). Цель состоит в том, чтобы новые производные типы «Base» регистрировались в «Manager», могли создавать экземпляры этого типа и выбирать тип на основе имени.
Мне интересно, представляет ли это безопасное поведение и/или есть ли альтернативные реализации для получения желаемого эффекта?
Я был проинформирован об этой статье, в которой предлагается общий объект регистрации, который принимает указанную выше пару в своем конструкторе и выполняет регистрацию, статический экземпляр которого затем определяется для каждого регистрируемого класса.