gpt4 book ai didi

c++ - boost::任何带有 char[] 的 map

转载 作者:太空宇宙 更新时间:2023-11-04 12:13:09 25 4
gpt4 key购买 nike

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

在我的驱动程序中,我希望能够从我的 map 中获取值。本质上是使用我的 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 *。有人可以指导我解决我的问题吗?我还没有看到很多人在 map 中存储 char 数组的例子。将 char[definite_size] 存储到 map 中的正确方法是什么?将其从 map 中拉出来是什么样的转换(boost::any 要求您在从 map 中拉出时转换为正确的类型)

最佳答案

在 C++ 和 C 中,数组类型和指针类型之间存在差异,尽管两者密切相关。例如,在 C 和 C++ 中,

int array[137];

int[137] , 不是 int* .也就是说,当您使用 array 时在 C 中,它退化为指向第一个元素的指针。然而,在 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 type 的赋值运算符是一个模板,它查看其参数的类型并存储此信息。结果,如果你说

boost::any myAny;
int myArray[137];

myAny = myArray;

认为这将有myAny变量存储 int[137] 类型的对象而不是 int* ,因为指针类型不会衰减。

要解决此问题,您应该考虑使用新的 std::array type 以明确指示您有一个正在存储的数组类型。这样,您就不会要求指针,而是会尝试拉出类似 std::array<int, 137> 的内容。 .或者,如果您确实知道您正在使用 char[1000]作为存储类型,您可以重新设计程序,这样您就不会使用 boost::any这里。您也可以考虑使用 typedef导出存储的默认类型(此处为 char[1000]),以便您可以转换为正确的类型。

希望这对您有所帮助!

关于c++ - boost::任何带有 char[] 的 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8965373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com