非标准语法;使用 '&' 创建指向成员的指针错误,将成员函数分配给向量时出错

non-standard syntax; use '&' to create a pointer to member error when assigning member function to vector

本文关键字:成员 出错 函数 分配 向量 创建 使用 语法 指针 非标准 错误      更新时间:2023-10-16

我试图将玩家类的成员函数添加到函数的向量。

这是需要键盘的函数向量::键为参数。

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

然后我有玩家实施

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...
}

我还有其他实例Similair可以正常工作,但与成员函数不正常。

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]);
        }
    }
}

是否可以在此向量中添加一个成员函数,如果没有,我该如何创建一些类似的东西?我是C 的新手,我创建了向量,因此我可以复制C#动作。这就是我要遇到问题的距离。这是一个早期概念,因为我仍然需要添加一种方法来从向量中删除功能。

OnKeyPlayer的非静态成员函数,因此需要调用Player的实例。即使您获得了指针到会员功能语法的权利,您仍然会有确切的问题,因为没有自动绑定;换句话说, this指向的实例不是自动用于生成可callable对象可用作为 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));

一般来说,在现代C 中,使用Lambdas和std::function,用于成员功能的指针的用例变得极为罕见。

useplayer :: onkey,(仅仅具有onkey or nekey dev&amp; onkkey)不足以指针到成员的情况。

是否可以在此向量

中添加一个成员函数

否。非静态成员函数指针与非成员功能指针和静态成员函数指针有很大不同。

,如果没有,我如何创建一些类似的东西?

使用lambda表达式。在lambda表达式中,请确保捕获this指针并在函数调用中使用它。

KeyEvent.push_back([this](Keyboard::Key key) {this->OnKey(key);});