C ++中的Void指针

时间:2015-12-26 01:17:12

标签: c++

我了解到模板是C ++中的void*等价物。这是真的吗?

我在一些程序中轮询“事件”时遇到此问题,当我有一个EventType变量时,我可能还需要传递与该事件相关的原始数据。

struct WindowEvent {
    enum Type {WINDOW_SIZE_CHANGE, USER_CLICK, ...};

    void* data;
};

然后,用户可以将data转换为必要的类型,具体取决于事件类型。

这种方法在C ++中是否可行?还有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

在C中,通常缺乏对多态性的支持,void*指针可用于接受任何类型的数据,以及实际类型的一些运行时表示,或者只是知道数据将被转换回到正确的类型。

在C ++和支持多态的其他语言中,通常使用动态多态(具有虚函数的类)或静态多态(函数重载和模板)。

主要区别在于C方法产生动态(运行时)手动类型检查,而C ++方法主要产生静态(编译时)和全自动类型检查。这意味着花在测试和追捕愚蠢容易预防的错误上的时间更少。成本是更冗长的代码,这意味着在某个地方存在代码大小偏移,在这种情况下,C方法可能会影响生产力,而C ++方法则高于此规则。

答案 1 :(得分:0)

"我了解到模板是C ++中的void 等价物。这是真的吗?" *

否 - 模板保持类型安全

"这种方法在C ++中是否可行?"

没有

"有更好的方法吗?"

根据用例,可以使用(例如)

class EventData {
   public:
      virtual int getData() = 0;
};

然后使用适当的继承类。也许使用智能指针。