我了解到模板是C ++中的void*
等价物。这是真的吗?
我在一些程序中轮询“事件”时遇到此问题,当我有一个EventType变量时,我可能还需要传递与该事件相关的原始数据。
struct WindowEvent {
enum Type {WINDOW_SIZE_CHANGE, USER_CLICK, ...};
void* data;
};
然后,用户可以将data
转换为必要的类型,具体取决于事件类型。
这种方法在C ++中是否可行?还有更好的方法吗?
答案 0 :(得分:4)
在C中,通常缺乏对多态性的支持,void*
指针可用于接受任何类型的数据,以及实际类型的一些运行时表示,或者只是知道数据将被转换回到正确的类型。
在C ++和支持多态的其他语言中,通常使用动态多态(具有虚函数的类)或静态多态(函数重载和模板)。
主要区别在于C方法产生动态(运行时)手动类型检查,而C ++方法主要产生静态(编译时)和全自动类型检查。这意味着花在测试和追捕愚蠢容易预防的错误上的时间更少。成本是更冗长的代码,这意味着在某个地方存在代码大小偏移,在这种情况下,C方法可能会影响生产力,而C ++方法则高于此规则。
答案 1 :(得分:0)
"我了解到模板是C ++中的void 等价物。这是真的吗?" *
否 - 模板保持类型安全
"这种方法在C ++中是否可行?"
没有
"有更好的方法吗?"
根据用例,可以使用(例如)
class EventData {
public:
virtual int getData() = 0;
};
然后使用适当的继承类。也许使用智能指针。