动态类型dereferrencing?

时间:2011-09-18 19:56:11

标签: c++ c dynamic

在试图回答另一个问题时,我被一群好奇心所吸引,并想知道一个想法是否可行。

  • 是否有可能动态取消引用void *指针(我们假设它指向有效引用的动态分配的副本)或运行时的其他类型以返回正确的类型?
  • 是否有某种方法可以存储提供的类型(例如,类知道void *指向int),如果是这样的话?
  • 可以说存储类型(如果可能)用于动态解除引用吗?
  • 一个类型可以作为函数的参数自己传递吗?

通常,概念(没有代码可用)是可以动态分配空间的void *指针(或类似)的双向链接列表,它还保留了它们为以后取消引用它们所持有的类型的副本。

2 个答案:

答案 0 :(得分:1)

1)动态参考:

没有。让它们保持一个包含实际指针和标签的结构,而不是让你的变量仅包含指针,该结构定义指针指向的类型

struct Ref{
    int tag;
    void *ref;
};

然后,当“解除引用”时,首先检查标签以找出你想要做的事情。


2)在变量中存储类型,将它们传递给函数。

这实际上没有意义,因为类型不是可以存储的值。也许你想要的只是传递一个类/构造函数,这当然是可行的。


最后,C和C ++是一种简单的语言。虽然动态语言中的变量赋值看起来很像C中的变量赋值(毕竟它们只是=)但实际上动态语言在幕后做了很多额外的事情(允许这样做)要做,因为新语言可以自由定义其语义)

答案 1 :(得分:1)

很抱歉,由于缺乏类型反射和缺乏动态绑定,这在C ++中实际上是不可能的。由于这些原因,动态解除引用尤其不可能。

您可以尝试通过将类型存储为枚举或std::type_info*指针来模拟其行为,但这些远非实用。它们需要注册类型,并且每次要对它们执行某些操作时都需要大量的switch..case或if..else语句。一个常见的容器类和几个包装类可能有助于实现它们(我确定这是一些设计模式,任何名称的想法?)

如果适合,您也可以使用继承来解决问题。

或许您需要重新考虑当前的设计。你到底需要做什么?