使用 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;
}
在做一些随机的、奇怪的事情以更多地了解 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;
}