假设我有:

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 要使用的成员函数。

有帮助吗?

解决方案

有很多方法可以给这只猫剥皮,包括模板。我最喜欢的是 升压功能 因为我发现从长远来看它是最灵活的。另请阅读 升压绑定 用于绑定到成员函数以及许多其他技巧。

它看起来像这样:

#include <boost/bind.hpp>
#include <boost/function.hpp>

void Render(boost::function0<void> Call)
{
    // as before...
}

Render(boost::bind(&MainMenu::Render, myMainMenuInstance));

其他提示

您可以制作一个包装函数 void Wrap(T *t) 这只是调用 t->Call() 并有 Render 将这样的函数与对象一起使用。那是:

void Wrap(T *t)
{
  t->Call();
}

void Render(void (*f)(T *), T *t)
{
  ...
  f(t);
  ...
}

我曾经通过定义一个全局函数“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 库的好消息,所以我建议在做任何激烈的事情之前先研究一下。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top