簡體   English   中英

使用成員函數作為回調

[英]Use a member function as callback

我想使用成員函數作為回調(使用此函數 ):

glfwSetCursorPosCallback(window, (GLFWcursorposfun)(MyClass::mouseButtonChanged));

我知道這是不可能的,因為我需要一個MyClass實例來調用方法mouseButtonChanged

但是我能做什么呢?

您可以使用glfwSetWindowUserPointer附加一個管理窗口的C ++類。 之后,您可以編寫一個靜態函數轉發到“ WindowManager”的成員函數

來自http://www.glfw.org/faq.html#how-do-i-use-c-methods-as-callbacks

2.16-如何將C ++方法用作回調?

您不能將常規方法用作回調,因為GLFW是C庫,並且不了解對象和此指針。 如果希望接收對C ++對象的回調,請使用靜態方法或常規函數作為回調,將指向您要調用的對象的指針存儲為窗口的用戶指針,並使用它來調用對象上的方法。

您需要傳遞這種類型的函數指針:

void (*)(GLFWindow*, double, double)

不幸的是,看起來它們並沒有給您提供任何形式的上下文參數的機會。 因此,一種方法是全局回調方法:

struct MyCallback {
    static MyClass* obj;

    static void callback(GLFWindow* window, double a, double b) {
        obj->mouseButtonChanged(window, double a, double b);
    }
};

使用方式如下:

MyCallback::obj = &myObj;
glfwSetCursorPosCallback(window, &MyCallback::callback);

之所以可行,是因為callback現在不需要實例。 不幸的是,現在我們有了一個遍布全球的MyClass* 但是,我們對此有些堅持。 我們在這里不能使用std::bind()表達式或lambda,因為任何帶有捕獲的內容都無法轉換為函數指針。

[更新]由於您可以在window上添加一個void* ,因此您也可以這樣做:

glfwSetWindowUserPointer(window, &myObj);
glfwSetCursorPosCallback(window, +[](GLFWindow* win, double a, double b){
    static_cast<MyClass*>(glfwGetWindowUserPointer(win))->mouseButtonChanged(win, a, b);
});

沒有捕獲的lambda上的operator+ (例如本例中的那個)將其轉換為原始函數指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM