是否可以定义指向自动解除引用作为特定类型的变化类型的指针?

时间:2013-07-29 14:26:04

标签: c++ casting type-conversion

是否可以定义指向未知数字类型的指针,例如intdouble,它总是在解除引用时返回特定类型,例如double

我开始这样做了,

int    a = 7;
double b = 3.14;

void* c = static_cast<void*>(&a);
void* d = static_cast<void*>(&b);

double e = *(static_cast<double*>(c));
double f = *(static_cast<double*>(d));

但当然,将int*转换为double*只会为e产生乱码,因为我们要将int的内部位重新解释为如果它们是double格式。

我试着提前回答为什么我需要这样做,因为肯定必须有更好的设计选项,但解释变得冗长。简而言之,它与遗留代码有关,其中一部分我无法修改,而且由于我们计划重写受影响的组件,我目前正在调查是否可以采用变通方法。

如果我的淡化版本被淡化,这里还有一个细节层次。我正在使用必须返回double的方法,通过解除引用曾经void指向double的指针(在共享内存中),但现在也可能指向int。当指针设置为指向另一个位置时,会调用一个“钩子”,此时会知道它是指向double还是int。所以我唯一能想到的就是在该钩子中将类型(或设置标志)存储在成员变量中,并在解除引用之前将其转换为该类型的指针。

但我希望有人会知道我可能错过的一个方便的技巧或技巧。存储指针或组织类型的一些其他方式,以便我根本不必修改钩子(我真的想避免这样做,因为其他,麻烦的解释原因)。

2 个答案:

答案 0 :(得分:2)

C ++是强类型的。表达式(expr)始终具有相同的静态类型。它可能具有可变动态类型,如果静态类型是动态类型的基本类型。这显然不是这里的情况。

因此,唯一的解决方案是编写两个强制转换:

if (flag)
  std::cout << * static_cast<int*>(ptr);
else
  std::cout << * static_cast<double*>(ptr);

两个表达式都有一个静态确定的类型,并且在运行时选择适用于ptr中数据的表达式(以及类型)。

答案 1 :(得分:1)

C和C ++没有“存储”什么类型的东西 - 编译器知道它,但是一旦代码编译完毕,这些信息就会被丢弃。它来自你写的表达式 - 当然void只是一种特殊的类型来表示“它没有类型”。

如果内容为intdouble,您需要以某种方式跟踪自己。如果你不能这样做,那么它就“被破坏”,无法完成。