2

我有 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 张具有相同概念的地图?

4

4 回答 4

3

这取决于您的操作员类是如何实现的(我们的信息很少),但我会制作一张可调用的地图,类似于以下内容:

#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 中。

于 2012-12-14T18:10:25.377 回答
2

使它们都从一个基类继承,存储指向基类的指针并使用多态性。

于 2012-12-14T17:55:08.870 回答
1

您不能将异构数据类型存储在映射(或任何其他 STL 容器)中。

最简单的解决方法是将它们全部从一个基类中子类化,并将基类存储在您的地图中。

编辑:我没有注意到避免多态性的愿望(虽然,我真的不明白为什么)。无论如何,我认为 boost::any 或 boost::variant 可能会对你有所帮助。您可以将它们全部存储为 boost::any。 http://www.boost.org/doc/libs/1_52_0/doc/html/any.html

于 2012-12-14T17:58:13.537 回答
0

boost::variant通常用于此类事情。

于 2012-12-14T18:00:31.810 回答