在做一些随意的事情时,奇怪的是要理解更多的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。
答案 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;
}