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

时间:2015-02-17 16:52:34

标签: c++ object callback sfml

在做一些随意的事情时,奇怪的是要理解更多的C ++(只是说我还是新手),我遇到了一些我无法理解的事情:我&# 39; m目前正在使用SFML,它提供了一些创建和管理窗口的方法,即关闭它的方法: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(窗口),类似于我认为的lua中的metatables。

1 个答案:

答案 0 :(得分:1)

它与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;
}