gpt4 book ai didi

c++ - 在 C++ 中使用类模板作为回调

转载 作者:太空宇宙 更新时间:2023-11-04 13:05:53 24 4
gpt4 key购买 nike

我能够在没有类模板的情况下使回调工作。但我的要求是通过传递模板形式的类对象来实现回调。我已经在 main() 中写下了我的意图,但不知何故我无法让它工作。

我不能使用 boost 和 C++11 来解决我当前的问题。任何帮助将不胜感激。

// TestProj.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "glb.h"
#include "Test.h"
#include <iostream>
using namespace std;

class MyCallBack
{
private:
class Callback
{
public:
virtual ~Callback() { }
virtual void call() = 0;
};

template <typename T>
class ClassCallback : public Callback
{
private:
T* object;
void (T::*callback)();

public:
ClassCallback(T* obj, void (T::*clbk)()) : object(obj), callback(clbk) {}
virtual void call() { (object->*callback)(); }
};

private:
Callback* callback;

public:
MyCallBack() : callback(NULL) { }
~MyCallBack() { delete callback; }

template <typename T>
MyCallBack(T* obj, void (T::*clbk)())
{
callback = new ClassCallback<T>(obj,clbk);
}

void operator () ()
{
callback->call();
}
};

typedef enum {
EVENT1 = 1,
EVENT2 = 2,
EVENT3 = 4,
EVENT4 = 8
} MyEvent_t;

template <class EventT>
class EventHandler
{
public:
virtual void on_event(EventT _event) = 0;
};

class MyHandler:public EventHandler<MyEvent_t>{

virtual void on_event(MyEvent_t _event){

switch(_event){

case EVENT1:
break;

case EVENT2:
break;

}
}
};

int _tmain(int argc, _TCHAR* argv[])
{
EventHandler<MyEvent_t> *my_handler = new MyHandler();
MyCallBack rcb(my_handler,&MyHandler<MyEvent_t>::on_event);

// to check the callback
rcb();

return 0;
}

非常感谢任何线索!!!

最佳答案

线

MyCallBack rcb(my_handler,&MyHandler<MyEvent_t>::on_event);

是一个问题,因为 on_event 需要一个参数。 MyCallBack() 的构造函数中预期的成员函数指针不带任何参数。

从编译/构建的角度来看,以下内容对我有用。您必须弄清楚如何使其适用于语义观点。

#include <iostream>
using namespace std;

class MyCallBack
{
private:
class Callback
{
public:
virtual ~Callback() { }
virtual void call() = 0;
};

template <typename T>
class ClassCallback : public Callback
{
private:
T* object;
void (T::*callback)();

public:
ClassCallback(T* obj, void (T::*clbk)()) : object(obj), callback(clbk) {}
virtual void call() { (object->*callback)(); }
};

private:
Callback* callback;

public:
MyCallBack() : callback(NULL) { }
~MyCallBack() { delete callback; }

template <typename T>
MyCallBack(T* obj, void (T::*clbk)())
{
callback = new ClassCallback<T>(obj,clbk);
}

void operator () ()
{
callback->call();
}
};

typedef enum {
EVENT1 = 1,
EVENT2 = 2,
EVENT3 = 4,
EVENT4 = 8
} MyEvent_t;

template <class EventT>
class EventHandler
{
public:
void event() { on_event(EventT()); }
virtual void on_event(EventT _event) = 0;
};

class MyHandler:public EventHandler<MyEvent_t>{

virtual void on_event(MyEvent_t _event){

switch(_event){

case EVENT1:
break;

case EVENT2:
break;

default:
break;
}
}
};

int main(int argc, char* argv[])
{
EventHandler<MyEvent_t> *my_handler = new MyHandler();
MyCallBack rcb(my_handler,&EventHandler<MyEvent_t>::event);

// to check the callback
rcb();

return 0;
}

关于c++ - 在 C++ 中使用类模板作为回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42408328/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com