映射到任何结构

时间:2016-03-28 06:57:04

标签: c++

我正在使用c ++ 我想创建一个map来存储项目中的任何结构 我有结构了:

struct My_Struct1{ int x;}
struct My_Struct2{float y;}
...

我想宣布一张地图:

MyMap[MessageID1] = My_Struct1_obj;
MyMap[MessageID2] = My_Struct2_obj;
....


MyMap应该是哪种类型?

map<unsigned int, ? > MyMap;

如果我map<unsigned int, void* >我怎么知道我是否想要访问int xfloat y?我需要在MessageID上做开关案例吗?

我收到消息后想要从匹配块中复制一些数据..

3 个答案:

答案 0 :(得分:4)

更简单的方法是为所有结构创建一个基类,并将指针存储到地图中。

struct BaseStruct
{
    virtual ~BaseStruct()
    {}
};
struct My_Struct1 : BaseStruct { int x; }
struct My_Struct2 : BaseStruct { float y; }

std::map<unsigned int, BaseStruct *> MyMap;

或者您可能更喜欢使用智能指针来处理对象的生命周期。

std::map<unsigned int, std::shared_ptr<BaseStruct> > MyMap2;
std::map<unsigned int, std::unique_ptr<BaseStruct> > MyMap3;

注意虚拟析构函数。这很重要,这样当你从地图中删除对象时,子类的内存就会被正确释放。

PS:看看boost::any。如果您不想要或不能使用基础结构,这可能会很有用。

答案 1 :(得分:3)

您可以通过继承实现这一点,创建一个基础结构并从该基础结构继承两个结构(如果需要,可以放置一些构造函数来初始化数据成员)。

//Your base struct
struct My_Base
{
    virtual void foo() {};
};

struct My_Struct1: virtual My_Base
{
public:
    int x;
    My_Struct1(int _x) { x = _x; }
};

struct My_Struct2 : virtual My_Base
{
public:
    float y;
    My_Struct2(float _y) { y = _y; }
};

map<unsigned int, My_Base*> _map;

为了使其易于理解,请在下面提供驱动程序或调用代码。

My_Base* obj1 = new My_Struct1(2);
My_Base* obj2 = new My_Struct2(3.2f);

//Adding some random test data to map
_map[1] = obj1;
_map[2] = obj2;

My_Base* mapObjBase = _map.find(2)->second;
//Downcast the object you retrieved from the map, this downcasting could fail so please note the if here.
if (My_Struct2* mapObj2 = dynamic_cast<My_Struct2*>(mapObjBase))
{
    cout << "My_Struct2.y = " << mapObj2->y << endl;
}
else
{
    cout << "Error..." << endl;
}
//Some memory cleaning before leaving the code block.
delete obj1;
delete obj2;

关于dynamic_cast的事情(如果你有兴趣进一步阅读......)

答案 2 :(得分:2)

您应该按以下方式声明结构类型:

struct My_Struct
{
    union
    {
        int x;
        float y;
    };
};

然后你可以按照以下方式使用它:

map<unsigned int, My_Struct> MyMap;