函数内的c ++ std :: bind

时间:2018-09-17 09:33:39

标签: c++ c++14

我正在为输入编写一个事件系统,其中我存储了所有已用键的回调向量。所有这些模板都将成为成员函数,其中一个浮点数作为参数,因此我为此使用std :: bind和一个占位符。我在Key类中有一个函数,该函数将回调添加到相应的向量中,并且我想在该函数中进行绑定,但是我遇到了一个问题,我找不到任何有关如何解决它的信息。

Key头文件具有以下用于添加回调的原型:

template <class T>
void addOnPressed(void toCall(float), T *callOn);

这实际上是函数的样子:

template <class T>
void Key::addOnPressed(void toCall(float), T *callOn) {
    onPressed.push_back(std::move(std::bind(toCall, callOn, std::placeholders::_1)));
}

要测试所有这些,我制作了一个Player类,该类在构造上添加了一些回调,该构造函数如下所示:

-Player(Texture2D Texture, int LayerIndex, Input &Input) : InputObj{ Texture, LayerIndex, Input } {
    input.keyboard.getKey(KeyboardKey::A).addOnPressed<Player>(&Player::moveLeft, this);
    input.keyboard.getKey(KeyboardKey::D).addOnPressed<Player>(&Player::moveRight, this);
    input.keyboard.getKey(KeyboardKey::W).addOnPressed<Player>(&Player::moveUp, this);
    input.keyboard.getKey(KeyboardKey::S).addOnPressed<Player>(&Player::moveDown, this);
};

所有这些都会给我以下错误:

C2664 'void Key::addOnPressed<Player>(void (__cdecl *)(float),T *)': cannot convert argument 1 from 'void (__cdecl Player::* )(float)' to 'void (__cdecl *)(float)

我猜我需要以某种方式告诉addOnPressed函数给定的函数指针来自类T,并且我尝试使用错误消息中给出的语法,但是我得到的仅仅是语法错误。

1 个答案:

答案 0 :(得分:0)

错误消息非常清楚,addOnPressed在传递成员函数指针时,将非成员函数指针作为其第一个参数。

您可以将参数类型更改为成员函数指针,例如

template <class T>
void addOnPressed(void (T::* toCall)(float), T *callOn)