boost::任何带有char[]的贴图
boost::any maps with char[]
在我的类中,我有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
的调用将填充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]
),以便可以转换为正确的类型。
希望这能有所帮助!
- 打印标准::<char>不带无关字符的矢量
- f 是指向函数的指针,该函数采用 int,并返回指向不带任何内容并返回双精度的函数的指针
- w/ w/结构带char缓冲液的静态初始化[]
- 在下面的例子中,是否有任何理由从使用 const char* 更改为字符串
- 将字符串解析为字符的指针数组:char[0] 包含完整的字符串,而 [1] 以后不包含任何内容
- char *带记忆泄漏
- 编写交叉平台代码时,使用char*而不是void*的任何陷阱
- C++:在main.cpp中声明一个结构,但在头中有一个带类的模板的任何可能性
- 有没有任何方法可以从C++中的char中获取虚拟密钥代码
- C++套接字编程,带压缩的多播,任何好的库/包装器
- 如何安全地确保char*类型将根据OpenGL规范正确实现(在任何平台上)
- 为什么类的 reinterpret_cast<const char*> 及其预初始化成员 int 相同,而任何其他类型的变量都不是?
- C++ 计数字符类型(大写、小写、数字、特殊),不带 if-else、三元或开关大小写.任何想法
- 可以使用 char[] 作为参数、返回等来解决任何性能问题
- 对于长度超过10个字母的字符串,char*的更改没有任何明显的原因.为什么?
- 使用static_cast将任何指针强制转换为char poiner
- Int(1digit)到char,不带任何函数
- "Truncation from int to char"不产生任何结果
- boost::任何带有char[]的贴图
- 如何使用信号来执行任何带参数的函数