Я пробовал авторегистрацию класса фабрики CRTP.Моя цель - не использовать макрос для регистрации типов классов и явно не вызывать метод register.
Я попытался, основываясь на этом ответе :
factory.h
template<typename Base>
struct Factory{
static Base* create(const QString& name){
auto callable = map.value(name);
return callable();
}
template<typename Derived>
static void subscribe(QString name){
// insert already-exist-check here
qDebug() << "registered: " << name;
map.insert(std::move(name), [](){return new Derived{};});
}
static QMap< QString, std::function<Base*(void)> > map;
};
template<typename Base>
QMap< QString, std::function<Base*(void)> > Factory<Base>::map;
template<typename Base, typename Derived>
class Registrable{
protected:
virtual QString registerName() const = 0;
Registrable(){
isRegistered;
}
~Registrable() = default;
static bool init(){
Derived t;
Factory<Base>::template subscribe<Derived>(t.registerName());
return true;
}
private:
static bool isRegistered;
};
template<typename Base, typename Derived>
bool Registrable<Base, Derived>::isRegistered = Registrable<Base, Derived>::init();
main.cpp
struct MyFactoryBase{
virtual ~MyFactoryBase() = default;
virtual void method() const = 0;
};
struct MyFactory1 : public MyFactoryBase, public Registrable<MyFactoryBase, MyFactory1>{
QString registerName() const override{
return "Class1";
}
void method() const override{ qDebug() << "yay Class1"; }
MyFactory1() : MyFactoryBase(), Registrable<MyFactoryBase, MyFactory1>(){}
};
struct MyFactory2 : public MyFactoryBase, public Registrable<MyFactoryBase, MyFactory2>{
QString registerName() const override{
return "Class2";
}
void method() const override{ qDebug() << "yay Class2"; }
MyFactory2() : MyFactoryBase(), Registrable<MyFactoryBase, MyFactory2>(){}
};
int main(){
// auto* fac = Factory<MyFactoryBase>::create("Class1");
// auto* fac2 = Factory<MyFactoryBase>::create("Class2");
}
сбой при segfault при попытке использовать map.insert () во время первой подписки.Чего мне не хватает?