题
假设我有:
void Render(void(*Call)())
{
D3dDevice->BeginScene();
Call();
D3dDevice->EndScene();
D3dDevice->Present(0,0,0,0);
}
只要我想用来渲染的函数是一个函数或一个函数就可以了 static
会员功能:
Render(MainMenuRender);
Render(MainMenu::Render);
但是,我真的希望也能够使用类方法,因为在大多数情况下,渲染函数需要访问成员变量,并且我不想使类实例成为全局的,例如
Render(MainMenu->Render);
但是我真的不知道如何做到这一点,并且仍然允许功能和 static
要使用的成员函数。
其他提示
您可以制作一个包装函数 void Wrap(T *t)
这只是调用 t->Call()
并有 Render
将这样的函数与对象一起使用。那是:
void Wrap(T *t)
{
t->Call();
}
void Render(void (*f)(T *), T *t)
{
...
f(t);
...
}
什么什么 C++ 常见问题解答:指向成员的指针 说?
我曾经通过定义一个全局函数“Call”来完成此操作,该函数接受指向您的实例的指针作为成员
void CallRender(myclass *Instance)
{
Instance->Render();
}
所以渲染变成:
void Render(void (*Call)(myclass*), myclass* Instance)
{
...
Call(Instance);
...
}
您对渲染的调用是:
Render(CallRender, &MainMenu);
我知道它很难看,但对我有用(我正在使用 pthreads)
除非您也有对该对象的引用,否则无法从指针调用成员函数。例如:
((object).*(ptrToMember))
因此,如果不更改渲染方法的签名,您将无法实现此目的。 这 文章解释了为什么这通常是一个坏主意。
更好的方法可能是定义一个“Renderer”接口,具有渲染方法的类可以实现该接口,并将其作为主渲染方法的参数类型。然后,您可以编写一个“StaticCaller”实现来支持通过引用调用静态方法。
例如(我的C++真的很生疏,我也没有编译过这个)。
void Render(IRenderer *Renderer)
{
D3dDevice->BeginScene();
Renderer->Render();
D3dDevice->EndScene();
D3dDevice->Present(0,0,0,0);
}
// The "interface"
public class IRenderer
{
public:
virtual void Render();
};
public class StaticCaller: public IRenderer
{
void (*Call)();
public:
StaticCaller((*Call)())
{
this->Call = Call;
}
void Render()
{
Call();
}
};
所有这些都是漂亮的样板文件,但它应该具有更高的可读性。
您可以使用以下方法声明指向类 T 的成员函数的函数指针:
typedef void (T::*FUNCTIONPOINTERTYPE)(args..)
FUNCTIONPOINTERTYPE function;
并将其调用为:
T* t;
FUNCTIONPOINTERTYPE function;
(t->*function)(args..);
将其推断为具有可变参数、类型、返回值等的有用柯里化系统是单调且烦人的。我听说过有关上述 boost 库的好消息,所以我建议在做任何激烈的事情之前先研究一下。
不隶属于 StackOverflow