具有相同概念的太多课程

时间:2012-12-14 17:52:18

标签: c++ class interface

我有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 个答案:

答案 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通常用于此类事情。