[英]Event System with Template class deriving from Non-Template base class in c++
我正在开发一个事件系统。 基本上,任何成员都可以插入“插槽”。 他们所需要的只是一个将要监听的事件名称和一个函数。 由于所有插槽都已存储,因此我必须将它们作为变量存储在类中。
将函数放入SlotBase类后,该函数将不可用。 我想知道是否有一种方法可以将功能存储在SlotBase类中同时保留在Slot类中。
class SlotBase { };
// TC - Template Class
// TA - Template Arguments (types)
template <class TC, typename ...TA>
class Slot : public SlotBase {
public:
Slot(TC* funcClass, void(TC::*func)(TA...)) {
SetSlot(funcClass, func);
}
template <int ...Is>
void SetSlot(TC* funcClass, void(TC::*func)(TA...), int_sequence<Is...>) {
function = std::bind(func, funcClass, placeholder_temp<Is>{}...);
}
void SetSlot(TC* funcClass, void(TC::*func)(TA...)) {
SetSlot(funcClass, func, make_int_sequence<sizeof...(TA)>{});
}
std::function<void(TA...)> returnFunction(){
return function;
}
private:
std::function<void(TA...)> function;
};
//...
class RandomClass {
public:
void randomFunction(int a, float b, int c){ //do stuff };
}
//...
RandomClass randC;
SlotBase baseS;
Slot newSlot(&randC, &RandomClass::randomFunction);
baseS = newSlot;
//...
//Later on down the line when an event was found matching slot call slot function
baseS.returnFunction()(//Correct arguments go here - leaving this out (a lot more code));
我没有在'std :: bind'中包含整数序列的代码,因为它与问题无关。
我知道,如果我在baseS
变量上使用Slot baseS
,这会给我结果,但由于我不知道Slot将拥有的模板,所以无法这样做。
我已经看过许多类似的文章,它们声明将baseS
用作指针(例如here ),但是我仍然不明白如何使用该函数。
我认为,如果要使用多态对象,则需要在某个时候开始接受这一点,您将需要在SlotBase
创建一个虚函数。 如果您想在使用函数之前在创建时回退您的类型,则多态性是没有意义的,因为您已经随身携带了原始类型,所以为什么要在第一时间进行转换?
如果确实需要升级,则需要考虑RUNTIME解决方案以重新访问派生的功能。 在这种情况下,这意味着您需要为信号创建一个通用接口,因此请尝试在SlotBase
中创建一个纯虚拟方法,该方法将打包未定义数量的参数,并在您的Slot
实现该通用调用程序,以便将其解压缩。依次输入参数,并使用参数调用您的广告位。 我不知道可变参数方法是否可以覆盖,这似乎是可疑的。 否则,您将不得不使用boost :: any或其他东西将参数打包到运行时集合中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.