因为我对C ++很陌生并且还需要学习很多东西,请耐心等待,也许还有一些愚蠢的问题:
基本上,我声明了一个map<wstring, int*>
,因为我要取消引用和使用的大多数变量是int
s(4个字节)。不幸的是,有罕见的是double
s(8字节)或short
s(2字节),我对此没有任何影响。为了简单起见,我想学习一些东西,我想阅读所有指向同一地图的指针。以下是我的想法:
map[wstring] = (int*) short*;//or double*
上述工作是否只是将short或double的内存地址的开头存储在地图而不是存储器的实际内容中?
据我所知,哪些键不同,我会在解除引用之前将指针强制转换回它们的类型:
short = *((short*) map[wstring]); // or double = *((double*) map[wstring]);
从我有限的知识来看,这可能有用。我会说,虽然从存储的内存地址通常会读取4个字节,因为这是地图声明的内容,现在,通过强制转换为short *或double *,我说我想要从存储地址的开头读取2或8个字节。事实上,它确实起到了至少与短裤的作用,但我不确定这是否只是巧合,我需要确定。
再次,如果这完全是胡说八道,我很抱歉,并提前感谢提高思维能力。
答案 0 :(得分:3)
如果您想要存储指向某些任意数据的指针,那么最简单的事情之一可能是标记的联合,如Boost.Variant:
typedef boost::variant<
int*,
double*,
short*
> SomePtr;
std::map<wstring, SomePtr> m;
通过这种方式,您可以安全地存储任何指针类型 ,并使用variant
类型提供的各种功能来获取值(例如boost::apply_visitor()
)。现在我不确定存储指针是否是一个要求,但如果你将其用作variant<int, double, short>
,这也是有效的。
或者,如果您不想使用Boost,您可以使用union
和索引编写自己的此变体版本:
class Variant {
union {
int* iptr;
double* dptr;
short* sptr;
};
int which;
public:
Variant(int* p): iptr(p), which(0) { }
Variant(double* p): dptr(p), which(1) { }
Variant(short* p): sptr(p), which(2) { }
// example
template <typename F>
void visit(F f) {
switch (which) {
case 0: f(iptr); break;
case 1: f(dptr); break;
case 2: f(sptr); break;
}
}
};
std::map<wstring, Variant> m;
答案 1 :(得分:0)
即使必须通过void指针,也始终可以将指针强制转换为指向其他类型的指针。但是在解除引用时,你会得到垃圾,因为你会错误地解释一个内存区。
如果你有一些魔法来了解实际上short *
或double *
的指针,你肯定可以做到。这是一个例子:
#include<iostream>
using namespace std;
int main()
{
double b = 0.5;
short h = 10;
int i = 5;
int *t[3] = { (int *) &b, (int *)&h, &i };
cout << *((double *) (t[0])) << " " << *((short *) (t[1])) << " " << *(t[2]) << endl;
return 0;
}
给出:
0.5 10 5
我的建议是: