【发布时间】:2017-10-08 05:11:22
【问题描述】:
我有一些不同类的对象,它们具有 update、render 和 eventHandler 方法,每个类都有相同的原型:
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?
【问题讨论】:
-
继承和虚方法?
-
或者如果类不适合继承结构,模板
-
不幸的是,您拒绝使用标准库。使用
std::function而不是原始函数指针会很容易。 -
在我之后重复(多次):指向非成员函数的指针不与指向成员函数的指针相同。最大的区别是成员函数需要调用对象,而非成员函数则不需要。
-
标准库可以帮助你。不要忽略它!
标签: c++ class templates methods function-pointers