我花了一些时间试图弄清楚如何做到这一点,但我想我需要帮助。如果我可以使用模板,我可以避免输入函数,比如' B :: theFuncToBeCalled',对吧?但是,只有在我没有弄错的情况下才能使用静态方法?
// A.h
typedef std::function <void()> CbType;
class A
{
template<typename T>
void setCallback(T &cb);
private:
template <typename T>
T callThisLater;
};
// A.cpp
template<typename T>
void A::setCallback(T &cb)
{
this->callThisLater = cb;
// later...
((CbType*)callThisLater)();
}
// B.cpp
// in constructor or wherever
{
A* a;
a->setCallback(this->theFuncToBeCalled);
// or, anonymous
CbType func = [this](){
// do something
// call theFuncToBeCalled() if I feel like it :)
};
a->setCallback(func);
}
void B::theFuncToBeCalled()
{
log("yay");
}
(如果我以匿名的方式尝试这样做,我会收到访问冲突错误。)
答案 0 :(得分:0)
这里有很多错误。让我们讨论一下,然后再解决它:
变量模板定义一系列变量或静态数据成员
this
parameter callThisLater
的类型被定义为接受一个方法,就不能随后将其更改为接受具有不同签名的lambda class A
很难重新实现可以用仿函数解决的问题,甚至只是函数指针请简单地删除class A
并使用函数指针和闭包类型:
auto a = &B::theFuncToBeCalled;
auto func = [=]() { (*this.*a)(); }
而不是使用a
继续前进,只需使用func
答案 1 :(得分:0)
我决定改变我的方法而不是保存指向回调的指针,而是保存指向成员函数所属对象的指针。它的工作量相同,但如果我需要调用几个不同的成员函数,我可以这样做:
objRef->theFuncToBeCalled();
// later
objRef->theOtherFuncToBeCalled();
我需要的只是一个指针。简单就是Best™,amiright? :)谢谢你的帮助!