gpt4 book ai didi

C++通过类模板函数中的指针访问类方法

转载 作者:太空宇宙 更新时间:2023-11-04 12:56:04 26 4
gpt4 key购买 nike

我有一些不同类的对象,它们具有 updaterendereventHandler 方法,每个类都有相同的原型(prototype):

class Menu {
...
public:
Menu ();

void update (WindowState *winState);
void render ();
void eventHandler (SDL_Event *event);
};

class Game {
...
public:
Game (Config *config);

void update (WindowState *winState);
void render ();
void eventHandler (SDL_Event *event);
};

所以,我想“设置事件对象”并通过指针调用这些方法:

struct {
void (*update) (WindowState *winState);
void (*render) ();
void (*eventHandler) (SDL_Event *event);
} routines;

template<class T>
void switchRoutines (T *obj) {
routines.update = &(obj->update);
routines.render = &(obj->render);
routines.eventHandler = &(obj->eventHandler);
}
...
switchRoutines<Game> (&game);
...
routines.render ();

但是,我得到类型不匹配:

error: cannot convert 'void (Game::*)(WindowState*)' to 'void (*)(WindowState*)' in assignment
routines.update = &(obj->update);

我读到过,指向类成员的指针应该用它们的类显式声明,但我的目标是编写一个通用的、类无关的例程切换器。

有没有办法使用STL或Boost?

最佳答案

您可以使用类型删除和模板函数来做到这一点,但您必须还保留对要在其上调用成员函数的实例的引用。
这是一个最小的工作示例:

struct SDL_Event;
struct WindowState;

struct Menu {
void update (WindowState *) {}
void render () {}
void eventHandler (SDL_Event *) {}
};

struct Game {
void update (WindowState *) {}
void render () {}
void eventHandler (SDL_Event *) {}
};

template<typename T, void(T::*)(WindowState *)>
void update(void *ptr, WindowState *winState) {
static_cast<T *>(ptr)->update(winState);
}

template<typename T, void(T::*)()>
void render(void *ptr) {
static_cast<T *>(ptr)->render();
}

template<typename T, void(T::*)(SDL_Event *)>
void eventHandler(void *ptr, SDL_Event *event) {
static_cast<T *>(ptr)->eventHandler(event);
}

struct {
void (*update) (void *, WindowState *);
void (*render) (void *);
void (*eventHandler) (void *, SDL_Event *);
void *instance;
} routines;

template<class T>
void switchRoutines (T *obj) {
routines.update = &update<T, &T::update>;
routines.render = &render<T, &T::render>;
routines.eventHandler = &eventHandler<T, &T::eventHandler>;
routines.instance = obj;
}

int main() {
Game game;
switchRoutines<Game> (&game);
routines.render (routines.instance);
}

你的期望值很高,但事实上我添加了一个实例 void * 指针来让它工作:

switchRoutines<Game> (&game);
routines.render (routines.instance);

如果您可以将它添加到您的 routines 对象,那么,这就是适合您的可行解决方案。

关于C++通过类模板函数中的指针访问类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46627731/

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