C++ 从基类调用派生类的函数模板
我有C++ 从基类调用派生类的函数模板,c++,templates,inheritance,types,C++,Templates,Inheritance,Types,我有结果、事件和事件后果类。 每个事件的派生类都有它触发的结果对象列表,这些对象存储在事件序列对象中。如果两个事件对象具有相同的类型(类),则它们必须触发相同的结果s 因此,在事件序列类中,我有: 无序映射结果; 样板 无效添加触发(结果*结果){ 结果[类型ID(事件)]。推回(结果); } 样板 无效触发后果(事件*事件){ 对于(结果*结果:结果[类型ID(事件)]); 结果->对(事件)作出反应; } 在事件中类: 事件后果*后果; 无效触发器(){ 后果->触发(此)的后果; }
结果
、事件
和事件后果
类。
每个事件
的派生类都有它触发的结果
对象列表,这些对象存储在事件序列
对象中。如果两个事件
对象具有相同的类型(类),则它们必须触发相同的结果
s
因此,在事件序列类中,我有:
无序映射结果;
样板
无效添加触发(结果*结果){
结果[类型ID(事件)]。推回(结果);
}
样板
无效触发后果(事件*事件){
对于(结果*结果:结果[类型ID(事件)]);
结果->对(事件)作出反应;
}
在事件中
类:
事件后果*后果;
无效触发器(){
后果->触发(此)的后果;
}
当然,我有很多派生类,包括事件
和结果
我想要的是它能工作,但它不能。它总是打电话来
EventsConsequences::触发(事件*)的结果
但不是派生类的
我要解决这个问题的唯一办法是使Event::trigger()
virtual
,并为每个派生类重写它
void DerivedEvent::trigger()覆盖{
后果->触发(此)的后果;
}
但我讨厌写湿代码。还有其他方法吗?使用奇怪的重复模板模式():
模板
结构基{
void foo(){
func(static_cast(this));
}
};
结构A:Base{};
结构B:Base{};
int main(){
A A;
B B;
a、 foo();
b、 foo();
}
使用奇怪的重复模板模式():
模板
结构基{
void foo(){
func(static_cast(this));
}
};
结构A:Base{};
结构B:Base{};
int main(){
A A;
B B;
a、 foo();
b、 foo();
}
您应该使用对象动态类型的类型索引
,而不是类型模板参数的类型索引
,来访问映射
consequences[typeid(*event)]
只需确保事件
至少有一个虚拟函数。您应该使用对象动态类型的类型索引
,而不是类型模板参数的类型索引
,来访问映射
consequences[typeid(*event)]
只需确保Event
至少有一个虚拟函数。因此,您想要实现多态性(“我想要的是func()依赖于类类型”),但不想使用内置工具来实现多态性?为什么要尝试让虚拟函数(动态多态性)调用模板(静态多态性)?你真的从模板分离中得到了什么吗?它对不同的类型有什么不同吗?如果是的话,为什么不能直接将不同的东西放在虚拟函数实现中,而不是放在模板中?您可能应该描述您正在尝试做什么,而不是您当前如何尝试做,因为这很可能是一个x/y问题。@下划线\u d编辑了我的问题。IMO如果您必须使用typeid()
,则通常表示您的设计可以重新考虑。不过,我并没有立即提出替代方案。所以,您想要实现多态性(“我想要的是func()依赖于类类型”),但不想使用内置工具来实现多态性?为什么要尝试让虚拟函数(动态多态性)调用模板(静态多态性)?你真的从模板分离中得到了什么吗?它对不同的类型有什么不同吗?如果是的话,为什么不能直接将不同的东西放在虚拟函数实现中,而不是放在模板中?您可能应该描述您正在尝试做什么,而不是您当前如何尝试做,因为这很可能是一个x/y问题。@下划线\u d编辑了我的问题。IMO如果您必须使用typeid()
,则通常表示您的设计可以重新考虑。不过,我并没有立即提出替代方案。注意:当我写那个答案时,问题看起来大不相同。注意:当我写那个答案时,问题看起来大不相同。