我正在使用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 x
或float y
?我需要在MessageID上做开关案例吗?
我收到消息后想要从匹配块中复制一些数据..
答案 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;