当我将方法作为参数传递时,如何忽略范围?

时间:2013-07-26 08:15:44

标签: c++

我有一个类SFAPin,有一种方法:

SFAPin::addListener(void (*)(SFAPinEvent&), uint8_t){};

但是当我尝试为此方法传递另一个类的一个方法时:

void InitialState::lightChange(SFAPinEvent &event){};

light.addListener(&this->lightChange, SFAPinEvent:PIN_CHANGE);

我得到了:
错误:没有匹配函数来调用'SFAPin :: addListener(void(InitialState :: *)(SFAPinEvent&),uint8_t)' 注意:候选者是:void SFAPin :: addListener(void(*)(SFAPinEvent&),uint8_t)

如果lightChange是静态方法,则可以正常使用:

light.addListener(lightChange, SFAPinEvent:PIN_CHANGE);

但我不想要静态方法

我该如何解决? 感谢

2 个答案:

答案 0 :(得分:0)

参数addListener()期望的是指向函数的指针。您传入的参数是指向成员函数的指针。您可以通过传递函数或添加一个方法来解决此问题,该方法需要指向成员函数的指针

SFAPin::addListener(void (InitialState::*)(SFAPinEvent&), uint8_t)

但是,你还必须添加一个对象指针,它可以与给定的方法一起使用,可能就像

SFAPin::addListener(InitialState &state, void (InitialState::*)(SFAPinEvent&), uint8_t)

答案 1 :(得分:0)

另一种方法是使用bind或lambda,使成员函数适应您需要的签名。 e.g。

bind(&InitialState::lightChange, this, _1);

详情here

或者,在C ++ 11中使用lambdas

addListener(
  [&] (SFAPinEvent &event)
  {
    lightChange(event);
  },
  SFAPinEvent:PIN_CHANGE
);

更多详情here

静态编译因为

  

“静态成员函数不需要实际对象   调用,所以通常指向静态成员函数   与常规指向函数类型兼容。“(来自here