boost::任何带有char[]的贴图

boost::any maps with char[]

本文关键字:char 任何带 boost      更新时间:2023-10-16

在我的类中,我有char数据[1000]。我希望能够有一个映射,使键类型字符串的映射映射到我想要的任何类型的数据。

在我的驱动程序中,我希望能够从地图中获取值。本质上,使用我的映射可以保存我的类的所有数据,这样我就不局限于在类的头中定义的数据,而是可以在运行时添加和删除数据。

例如类定义:

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[define_size]和char*。有人能告诉我我的问题在哪里吗?我并没有见过很多人在地图中存储char数组的例子。将char[define_size]存储到地图中的正确方法是什么?将其从映射中取出的铸造是什么样子的(boost::any需要在从映射中拉出时铸造到正确的类型)

在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]),以便可以转换为正确的类型。

希望这能有所帮助!

相关文章: