gpt4 book ai didi

c++ - 非标准语法;使用 '&' 创建指向成员的指针 将成员函数分配给 vector 时出错

转载 作者:行者123 更新时间:2023-11-28 04:53:37 24 4
gpt4 key购买 nike

我正在尝试将 Player 类的成员函数添加到函数 vector 中。

这是需要 Keyboard::Key 作为参数的函数 vector 。

vector<function<void(Keyboard::Key)>> KeyEvent;

然后我有 Players 实现

Player::Player() {
KeyEvent.push_back(OnKey); //error: non-standard syntax; use '&' to create a pointer to member
}

void Player::OnKey(Keyboard::Key key) {
//do something with key...
}

我还有其他一些例子,其中某些代码类似的东西可以正常工作,但不适用于成员函数。

vector<function<void()>> UpdateEvent;

UpdateEvent.push_back(HandleInputUpdate);

void HandleInputUpdate() {
for (size_t i = 0; i < pressedKeys.size(); i++) {
for (size_t e = 0; e < KeyEvent.size(); e++) {
KeyEvent[e](pressedKeys[i]);
}
}
}

是否可以向这个 vector 添加一个成员函数,如果不能,我该如何创建类似的东西?我是 C++ 的新手,我创建了 vector 以便可以复制 C# 操作。这是我遇到问题之前走了多远。这是一个早期的概念,因为我仍然需要添加一种方法来从 vector 中删除函数。

最佳答案

OnKeyPlayer 的非静态成员函数因此需要一个 Player 的实例被召见。即使您正确地使用了指向成员函数的语法,您仍然会遇到那个确切的问题,因为没有自动绑定(bind);换句话说,this 指向的实例不会自动用于生成可用作 std::function<void(Keyboard::Key)> 的可调用对象.

实现您想在此处执行的操作的一种非常简单的方法是使用 lambda:

KeyEvent.push_back([this](auto key) { OnKey(key); });

OnKey(key);函数中的调用相当于this->OnKey(key); .


更复杂(在我看来)的方法是使用 std::bind :

using namespace std::placeholders;
KeyEvent.push_back(std::bind(&Player::OnKey, this, _1));

一般来说,使用 lambda 和 std::function在现代 C++ 中,成员函数指针的用例变得极为罕见。

关于c++ - 非标准语法;使用 '&' 创建指向成员的指针 将成员函数分配给 vector 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47641982/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com