#include "iostream"
#include <map>
using namespace std;
template <class Operation_Type>
class OperationRegister
{
public:
virtual Operation_Type* createOperation(const string& opName) = 0;
protected:
OperationRegister(){}
virtual ~OperationRegister(){}
};
template <class Operation_Type>
class OperationFactory
{
public:
static OperationFactory<Operation_Type>& Instance()
{
static OperationFactory<Operation_Type> instance;
return instance;
}
void RegisterOperation(const std::string& opName, OperationRegister<Operation_Type>* reg)
{
operationRegister[opName] = reg;
}
Operation_Type* getOperation(const string& opName)
{
if(operationRegister.find(opName) != operationRegister.end())
{
return operationRegister[opName]->createOperation(opName);
}
return nullptr;
}
private:
OperationFactory() = default;
~OperationFactory() = default;
OperationFactory(const OperationFactory& ) = delete;
const OperationFactory& operator= (const OperationFactory&) = delete;
map<string, OperationRegister<Operation_Type>* > operationRegister;
};
template <class Operation_Type, class OperationImpl>
class OperationImplRegister : public OperationRegister<Operation_Type>
{
public:
explicit OperationImplRegister(const string& opName)
{
OperationFactory<Operation_Type>::Instance().RegisterOperation(opName, this);
}
Operation_Type* createOperation(const string& opName)
{
return new OperationImpl(opName);
}
};
class Person
{
public:
virtual string Name() = 0;
virtual void showName() = 0;
};
class Wang : public Person
{
public:
Wang(const string& name):name(name){}
string Name() override
{
return name;
}
void showName() override
{
cout << "Name: " << name << endl;
}
private:
string name;
};
class Li : public Person
{
public:
Li(const string& name):name(name){}
string Name() override
{
return name;
}
void showName() override
{
cout << "Name: " << name << endl;
}
private:
string name;
};
class Zhang : public Person
{
public:
Zhang(const string& name):name(name){}
string Name() override
{
return name;
}
void showName() override
{
cout << "Name: " << name << endl;
}
private:
string name;
};
void Init()
{
static bool init = false;
if(not init)
{
static OperationImplRegister<Person, Wang> wang("Wang");
static OperationImplRegister<Person, Li> li("Li");
static OperationImplRegister<Person, Zhang> zhang("Zhang");
init = true;
}
}
class JudgeName
{
public:
JudgeName(){}
Person* Judge(const string& name)
{
OperationFactory<Person>& fac = OperationFactory<Person>::Instance();
return fac.getOperation(name);
}
};
int main()
{
Init();
JudgeName jm;
auto res = jm.Judge("Zhan");
if(res != nullptr)
{
res->showName();
}
else
{
cout << "name is unvaild" <<endl;
}
auto res1 = jm.Judge("Zhang");
if(res1 != nullptr)
{
res1->showName();
}
else
{
cout << "name is unvaild" <<endl;
}
getchar();
return 0;
}
C++ 实现反射
于 2022-11-29 09:52:04 首次发布
本文展示了如何使用C++模板类和工厂模式来实现操作的注册和根据名称实例化。通过`OperationRegister`和`OperationFactory`类,可以动态注册不同的操作类型如`Person`的实现(如`Wang`, `Li`, `Zhang`),并在需要时通过`JudgeName`类根据名字创建相应操作对象。

2747

被折叠的 条评论
为什么被折叠?



