使用 std::function 从无对象调用非静态方法

Call a non-static method from no object using std::function

在做一些随机的、奇怪的事情以更多地了解 C++ 时(只是说我还是个新手),我遇到了一些我无法正确理解的事情:我目前使用 SFML,它提供了一些方法来创建和管理 window,即关闭它的方法:void sf::RenderWindow::close()。它不带任何参数,不能直接调用,只能通过实例化对象调用。

sf::RenderWindow::close(); // error

我的问题是以下代码:

sf::RenderWindow window(sf::VideoMode(800, 600), "test"); // added after edit

const std::function <void(sf::RenderWindow &)> callback(sf::RenderWindow::close);
// callback(); 
callback(window); // closes the window

我不确定这里发生了什么,因为我没有使用任何对象...甚至乍一看是匿名的...我猜...

如果有人能开导我,我将不胜感激。

谢谢。

编辑:

我的错误,是的,有一个对象。

#include <iostream>
#include <functional>
#include <SFML/Graphics.hpp>


int main()
{
      sf::RenderWindow window(sf::VideoMode(800, 600), "test");

      const std::function <void(sf::RenderWindow &)> call(sf::RenderWindow::close);
      call(window);

      return 0;
}

实际上,我将其理解为 sf::RenderWindow::close(window),我想类似于 lua 中的元表。

它与Callable的概念有关:

由于std::function(即sf::RenderWindow::close)的存储目标是指向成员函数的指针,而第一个参数(即window)是一个(对)对象类型为RenderWindow,则函数对象的调用等价于window.close().

您也可以按照这些思路写一些东西:

std::function<void(sf::RenderWindow*)> call = &sf::RenderWindow::close;
call(&window);

下面是不涉及 SFML 的代码示例:

#include <iostream>
#include <functional>

class Window {
public:
    void close() {std::cout << "close" << std::endl; }
};

int main(int argc, const char * argv[]) {

    Window w;

    std::function<void(Window&)> f = &Window::close;

    f(w);

    std::function<void(Window*)> g = &Window::close;

    g(&w);

    return 0;
}