【问题标题】:How do you pass a non-static function as a callback?如何将非静态函数作为回调传递?
【发布时间】:2011-12-04 05:43:13
【问题描述】:

我目前正在使用 Qt 和图形引擎,在 QGLWidget 实例的初始化期间,我需要将一些函数指针传递给我的引擎。

寻找回调的函数是:

virtual void Buffer::CreateCustom( byte* getsize, byte* makecurrent)

Qt 提供了一个makeCurrent function,但它既不是字节*也不是静态的。

我可以像这样写一个小包装函数:

void _stdcall MakeCurrent(void)
{
    QGLContext::makeCurrent();
}

但它只意味着从 GLWidget 的实例中调用。我试图像这样创建一个类成员包装函数:

void _stdcall LEWidget::leMakeCurrent(void)
{
    makeCurrent();
}

但是你只能在静态成员函数上提供函数指针。如果我这样做,我会收到以下错误:

错误 C2352: 'QGLWidget::makeCurrent' : 非法调用非静态成员函数。非静态成员引用必须相对于特定对象。

【问题讨论】:

  • 不知道 Qt f/w..但是你看过 "boost::function" 和 "boost::bind" 吗?
  • 嗯,在我看来,必须有一种本地的方式来做这件事。我一定是走错路了。
  • 如果 Qt 期望 makeCurrent() 被“从 GLWidget 的实例中调用”,你应该遵循这个协议,否则回调很可能会在执行时失败。您可以使用下面 nacho4d 提供的链接进行操作。
  • 是我还是 CreateCustom 被宣布真的,真的错了吗? byte* 是函数指针吗?

标签: c++ qt


【解决方案1】:

看到这个问题,我认为这几乎是你想做的:

How do I implement a callback in C++?

【讨论】:

  • 我目前正在VC2010下编译——你知道函数绑定是否原生可用吗?
  • 好的,我刚刚实现了boost函数+绑定,但我仍然需要将它转换为字节*。想法?
【解决方案2】:

你不能。这就是 std::function 存在的目的。你要么改变你的界面以使用std::function,幸运地找到某种void* context参数,要么放弃。

【讨论】:

    【解决方案3】:

    这是因为当回调被调用时,不可能(从编译器的 POV)告诉哪个this 指针应该传递给该函数。如果你真的想传入一个指针,你必须使用汇编。

    【讨论】:

      猜你喜欢
      • 2011-01-07
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      相关资源
      最近更新 更多