Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从基类调用派生类的函数模板_C++_Templates_Inheritance_Types - Fatal编程技术网

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()
,则通常表示您的设计可以重新考虑。不过,我并没有立即提出替代方案。注意:当我写那个答案时,问题看起来大不相同。注意:当我写那个答案时,问题看起来大不相同。