[英]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.