是否使用 std::function 创建回调(支持 lambda 和捕获)?

Use std::function for creating callbacks(with support of lambda with capture) or not?

提问人:Ciborg 提问时间:6/29/2023 最后编辑:Ciborg 更新时间:6/29/2023 访问量:44

问:

我现在正在编写使用 glfw 创建窗口的输入处理,并坚持使用回调功能。尝试将其包装在我自己的 Window 类中,但是要通过捕获处理 labmda 需要使用 std::function,(我不确定这是好方法?

//example of solution
class MyWindow
{
public:

void SetInputCallback(MyInputCallback callback);
private:
    static void inputCallback(GLFWwindow* Window, int32 key, int32 scancode, int32 action, int32 mods);
        GLFWwindow* window;
MyInputCallback CallbackFunc = nullptr;
}

// cpp
void MyWindow::inputCallback(GLFWwindow* Window, int32 key, int32 scancode, int32 action, int32 mods){
if(CallbackFunc)
CallbackFunc(Window,key,scancode,action,mods);
}

void MyWindow::SetInputCallback(MyInputCallback callback)
{
InputCallbackFunction = callback;
glfwSetKeyCallback(window, inputCallback);
};

想知道 std::function 是否好(或者足够好?)或者最好使用模板/简单的 typedef 和一些代码(但它不支持带捕获的 lamda,也不会明确说明我的窗口想要作为回调获得什么)

C++ 函数 回调 glfw std-function

评论

0赞 Julien Lopez 6/29/2023
两者都没问题,问题是什么对你来说更重要。std::function 的主要缺点是运行时成本(它确实是类型擦除,所以动态内存等)。如果这对你来说没问题,std::function 可能会让你的代码更具可读性。如果不是这样,模板的东西会更有效率,但会以可读性为代价(而且随着最近的标准,这种情况也变得更好了。顺便说一句,你可以同样严格地使用 c++20 的合约作为模板传递的内容。
0赞 Ciborg 6/29/2023
感谢您的回答,c++ 20 有很多好东西,但现在我将支持 c++ 11+,所以也许 std::function 会是解决方案(至少现在是这样)

答: 暂无答案