C ++ Map类的价值

时间:2018-11-22 09:51:19

标签: c++ class

我需要用类的值制作地图。现在看起来像:

if (string=="Reg") {
Registration Registration(Data);
    Registration.GetResult();
}

if (string=="Auth") {
Login Login(Data);
    Login.GetResult();
}
.....

,我想这样做:

map <std::string, class_name> ClassList;
ClassList ["Reg"] = Registration;
ClassList ["Auth"] = Login;

......

ClassList [string](Data).GetResult();

感谢帮助!

2 个答案:

答案 0 :(得分:4)

一种方法是拥有(无序的)功能图:

std::unordered_map<std::string, std::function<void(DataCls)>> map;
map["Reg"] = [](DataCls Data) {
    Registration Registration(Data);
    Registration.GetResult();
};
map["Auth"] = [](DataCls Data) {
    Login Login(Data);
    Login.GetResult();
};
...
map[string](Data);

可以使用以下模板化函数简化此操作:

template<class T>
void Handler(DataCls Data) {
    T instance(Data);
    instance.GetResult();
};

map["Reg"] = Handler<Registration>;
map["Auth"] = Handler<Login>;
...
map[string](Data);

答案 1 :(得分:1)

我建议使用以下继承层次结构:

#include <iostream>
#include <string>
#include <map>

class IOperation
{
public:
    virtual ~IOperation(){}
    virtual int GetResult() = 0;
};

class Registration : public IOperation
{
public:
    int GetResult() override
    {
        return 1;
    }
};

class Login : public IOperation
{
public:
    int GetResult() override
    {
        return 2;
    }
};

int main()
{
    std::map<std::string, IOperation *> classList;

    classList["Reg"] = new Registration();
    classList["Auth"] = new Login();

    std::string cmd = "Auth";
    std::cout << classList[cmd]->GetResult();
}