我有5个用作运算符的类:
TurnOn , TurnOff , PushBox , Exit , Enter
我对每种类型都有一个包含该类型描述的字符串。
例如:
class Places {
enum Type { Room1 ,Room2 ,Room3 ,Room4 };
// more stuff
};
TurnOn turnOn(Places::Room1);
string turnOnString = "TurnOn(Room1)" ;
我想将信息存储在地图中,因此每个运营商都有5张地图:
map <string , TurnOn > opeatorTurnOn;
map <string , TurnOff > opeatorTurnOff ;
map <string , PushBox > opeatorTPushBox ;
map <string , Exit > opeatorExit ;
map <string , Enter > opeatorEnter ;
但现在我有5张具有相同概念的地图:一个带有运算符的字符串。
如何将运算符存储在一个地图中,这样我就不必拥有5个具有相同概念的地图?
答案 0 :(得分:3)
这取决于你的运算符类的实现方式(我们的信息很少),但我会制作一个类似于此的callables地图:
#include <iostream>
#include <functional>
#include <map>
struct op1
{
void operator()(int i) { std::cout << "op1::operator() " << i << "\n"; }
};
struct op2
{
void operator()(int i) { std::cout << "op2::operator() " << i << "\n"; }
};
int main()
{
std::map<std::string, std::function<void(int)>> ops;
ops["1"] = op1{};
ops["2"] = op2{};
ops["1"](42);
ops["2"](42);
}
如果不使用operator()
重载,也可以将操作包装在lambdas中。
答案 1 :(得分:2)
让它们全部从一个基类继承,存储指向base的指针并使用多态。
答案 2 :(得分:1)
您无法在地图(或任何其他STL容器)中存储异构数据类型。
最简单的解决方法是将它们从一个基类中继承,并将基类存储在地图中。
编辑:我没有注意到避免多态性的愿望(但是,我真的不明白为什么)。无论如何,我认为boost :: any或boost :: variant可能会对你有所帮助。您可以将它们全部存储为boost :: any。 http://www.boost.org/doc/libs/1_52_0/doc/html/any.html答案 3 :(得分:0)
boost::variant
通常用于此类事情。