繁体   English   中英

模板类源自C ++中非模板基类的事件系统

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM