【问题标题】:Is it possible to define a pointer to a varying type that automatically dereferences as a specific type?是否可以定义指向自动取消引用为特定类型的可变类型的指针?
【发布时间】:2013-07-29 14:26:03
【问题描述】:

是否可以定义一个指向未知数字类型的指针,例如 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。所以我唯一能想到的就是在该挂钩期间将类型(或设置标志)存储在成员变量中,并在取消引用之前转换为该类型的指针。

但我希望有人知道我可能错过的方便技巧或技巧。存储指针或组织类型的其他方式,这样我就不必修改钩子了(出于其他难以解释的原因,我真的很想避免这样做)。

【问题讨论】:

  • 如果指向int,可以将int转成double并返回吗?

标签: c++ casting type-conversion


【解决方案1】:

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

因此,唯一的解决方案是编写两个演员表:

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

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

【讨论】:

    【解决方案2】:

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

    如果内容是intdouble,您需要自行跟踪。如果你做不到,那就是“失败”,做不到。

    【讨论】:

      猜你喜欢
      • 2022-11-23
      • 2017-02-25
      • 1970-01-01
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 2019-12-17
      相关资源
      最近更新 更多