使用char []提升::任何地图

时间:2012-01-22 22:42:34

标签: c++ arrays boost casting map

在我班上,我有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要求你在拉出地图时施放到正确的类型)

1 个答案:

答案 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的调用将填写argint[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]),以便您可以转换为正确的类型。

希望这有帮助!