我需要用类的值制作地图。现在看起来像:
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();
感谢帮助!
答案 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();
}