#ifndef TEMPLATE_H_H
#define TEMPLATE_H_H
#include <iostream>
#include <functional>
#include <string>
#include <map>
class Base {
public:
virtual void testFunction() {
std::cout << "Base::testFunction" << std::endl;
}
};
class Child : public Base {
public:
virtual void testFunction() override {
std::cout << "Child::testFunction" << std::endl;
}
};
using CreateClassObjectFunc = std::function<Base*()>;
class ClassFactory
{
public:
~ClassFactory() {
classMap_.clear();
}
public:
bool registerClass(const std::string& name, CreateClassObjectFunc func)
{
if (classMap_.find(name) == classMap_.end()) {
classMap_.emplace(name, func);
}
else {
classMap_[name] = func;
}
return true;
}
Base* createObject(const std::string& name)
{
auto iter = classMap_.find(name);
if ( iter == classMap_.end()) {
return nullptr;
}
return iter->second();
}
static ClassFactory* Instance() {
static ClassFactory obj;
return &obj;
}
protected:
ClassFactory() = default;
private:
std::map<std::string, CreateClassObjectFunc> classMap_;
};
#define REGISTER_CLASS(ClassName) \
extern bool ret##ClassName;
/**
* .cpp
* #undef REGISTER_CLASS
* #define REGISTER_CLASS(ClassName) \
* bool ret##ClassName = ClassFactory::Instance()->registerClass(#ClassName, []()->CMessageMsg* { \
* return new ClassName; \
* });
*
* REGISTER_CLASS(Base)
* REGISTER_CLASS(Child)
*/
#endif
C++实现根据字符串创建对象
最新推荐文章于 2023-05-09 19:35:35 发布