我花了一些时间来弄清楚如何做到这一点,但我认为我需要帮助。如果我可以使用模板,我就可以避免键入函数,例如“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");
}
(如果我尝试以匿名方式执行此操作,我会收到访问冲突错误。)
最佳答案
这里有很多错误。让我们讨论一下,然后讨论如何解决它:
- 您不能简单地在实现文件中定义模板化函数:https://isocpp.org/wiki/faq/templates#templates-defn-vs-decl
- c++14的 variable templates仅适用于静态变量:
A variable template defines a family of variables or static data members
- 您正在传递一个方法,并试图像传递一个函数一样使用它,methods implicitly take the
this
parameter - 一旦
callThisLater
的类型被定义为接受一个方法,它就不能随后更改为接受具有不同签名的 lambda A 类
是对可以用仿函数甚至函数指针解决的问题的糟糕重新实现
请简单地删除 class A
并使用函数指针和闭包类型:
auto a = &B::theFuncToBeCalled;
auto func = [=]() { (*this.*a)(); }
与其使用a
,不如简单地使用func
关于c++ - (C++新手)保存一个函数指针,以后可以调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48621970/