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

时间:2017-12-04 21:08:48

标签: c++

我试图将Player Class的成员函数添加到函数向量中。

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

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

是否可以向此向量添加成员函数,如果没有,我怎么能创建similair?我是C ++的新手,我创建了向量,因此我可以复制C#Actions。这是我遇到问题直到有多远。这是一个早期概念,因为我仍然需要添加一种从向量中删除函数的方法。

3 个答案:

答案 0 :(得分:1)

OnKeyPlayer的非静态成员函数,因此需要调用Player的实例。即使你有指向成员函数的指针语法,你仍然会遇到这个问题,因为没有自动绑定;换句话说,this指向的实例 not 自动用于生成可用作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,指向成员函数的用例变得非常罕见。

答案 1 :(得分:0)

UsePlayer :: OnKey(仅具有OnKey或甚至&amp; OnKkey)不足以指向成员指针。

答案 2 :(得分:0)

  

是否可以向此向量添加成员函数

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

  

如果没有,我怎么能创造出类似的东西?

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

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