在我班上,我有char数据[1000]。我希望能够有一个映射,以将键类型字符串映射映射到我想要的任何类型的数据。
在我的驱动程序中,我希望能够从地图中获取值。基本上使用我的map可以保存我的类的所有数据,这样我就不会限制在类的头中定义的数据,但可以在运行时添加和删除数据。
例如类定义:
public:
void populateMap()
{
classMap["imgData"] = data;
};
private:
map<string,boost::any> classMap;
char data[1000];
驱动器:
int main(){
myClass test;
map<string,boost::any> myMap;
test.populateMap()//populates map with the char data
myMap = test.getMap();
char myData[1000] = boost::any_cast<char*>(myMap["imgData"]); //runtime error
}
当我这样做时,我得到运行时转换错误。我不熟悉char [definite_size]和char *。有人可以指导我的问题所在吗?我没有看到很多人在地图中存储char数组的例子。将char [definite_size]存储到地图中的正确方法是什么?什么样的铸件看起来像是从地图上取回来的(boost :: any要求你在拉出地图时施放到正确的类型)
答案 0 :(得分:1)
在C ++和C中,数组类型和指针类型之间存在差异,尽管两者密切相关。例如,在C和C ++中,
的类型int array[137];
是int[137]
,而不是int*
。也就是说,当你在C中使用array
时,它会衰减成指向第一个元素的指针。但是,在C ++中,可以获得对数组的引用。例如,此代码完全合法:
/* This function takes a reference to an array of 137 elements as a parameter! */
void MyFunction(int (&array)[137]) {
/* ... */
}
int myArray[137];
MyFunction(myArray);
这里,MyFunction
的参数类型是int (&)[137]
,是对137个整数数组的引用。
使用模板时会出现这种情况。例如,如果我们有这个模板函数:
template <typename T> void MyFunction(T& arg) {
/* ... */
}
int myArray[137];
MyFunction(myArray);
然后,对MyFunction
的调用将填写arg
为int[137]
,而不是int*
,因为参数的类型为int[137]
。
这是一个问题的原因是(IIRC)boost::any
类型的赋值运算符是一个模板,它查看其参数的类型并存储此信息。结果,如果你说
boost::any myAny;
int myArray[137];
myAny = myArray;
我认为这将使myAny
变量存储类型int[137]
而不是int*
的对象,因为指针类型不会衰减。
要解决此问题,您应该考虑使用新的std::array
类型来明确指出您是否存储了数组类型。这样,你不会要求指针,而是试图拉出像std::array<int, 137>
这样的东西。或者,如果您知道您使用char[1000]
作为存储类型的事实,则可以重新设计程序,以便您不在此处使用boost::any
。您还可以考虑使用typedef
导出存储的默认类型(此处为char[1000]
),以便您可以转换为正确的类型。
希望这有帮助!