C++ 实现反射

本文展示了如何使用C++模板类和工厂模式来实现操作的注册和根据名称实例化。通过`OperationRegister`和`OperationFactory`类,可以动态注册不同的操作类型如`Person`的实现(如`Wang`, `Li`, `Zhang`),并在需要时通过`JudgeName`类根据名字创建相应操作对象。
#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;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值