游戏引擎有这个类:
class MouseListener{
public :
MouseListener();
virtual void OnMouseDown(int mx,int my);
virtual void OnMouseUp(int mx,int my);
.
.
.
};
每个想监听鼠标输入的对象都必须继承该类并重写其方法。为了避免每次声明新类型,该类被修改为:
每个希望监听鼠标输入的对象,都需要继承该类并覆盖其方法。为了避免每次都需要声明一个新类型,该类被修改为:
class MouseListener{
public :
MouseListener();
std::function <void(MouseListener*,int,int)>OnMouseDown;
std::function <void(MouseListener*,int,int)>OnMouseUp;
.
.
.
};
现在可以通过以下方式使用该类:
MouseListener * m = new MouseListener();
m->OnMouseDown = [](MouseListener * thiz,int x,int y){
//// do something
};
仅调用输入系统中不为 null(已分配)的 MouseListener 函数(thiz = 鼠标侦听器)。如果知道该类来自外部库(静态链接),从性能角度来看,哪个更好?
注意:除非接收到鼠标事件,否则不会调用这些函数中的任何一个函数;当发生鼠标事件时,针对每个监听鼠标输入的对象调用相应的函数(不应该很多,少于50个)
std::function
内部同样使用虚函数实现。编译器必须从隐藏在std::function
中的指针中提取vtable并进行间接调用,而不是检索类vtable插槽并进行间接调用。作为额外的缺点,std::function
非常复杂,以至于我从未见过编译器对其进行任何解虚拟化处理,在许多情况下它会对“普通”的虚函数进行处理。 - Matteo Italia