(新增C++)保存稍后可以调用的函数指针
(New to C++) Save a function pointer that can be called later
我花了一些时间试图弄清楚如何做到这一点,但我认为我需要帮助。如果我可以使用模板,我可以避免输入函数,例如"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 的变量模板仅适用于静态变量:
模板定义一系列变量或静态数据成员
- 您正在传递一个方法,并尝试像传递函数一样使用它,方法隐式采用
this
参数 - 一旦将
callThisLater
类型定义为接受方法,就无法随后将其更改为接受具有不同签名的 lambda class A
是用函子甚至只是函数指针可以解决的问题的糟糕重新实现
请简单地消除class A
并使用函数指针和闭包类型:
auto a = &B::theFuncToBeCalled;
auto func = [=]() { (*this.*a)(); }
与其使用a
继续前进,不如使用func
我决定改变我的方法,而不是保存指向回调的指针,而是保存指向成员函数所属对象的指针。这是相同的工作量,但好处是,如果我需要调用几个不同的成员函数,我可以只做:
objRef->theFuncToBeCalled();
// later
objRef->theOtherFuncToBeCalled();
而我所需要的,只是一个指针。简单是最好的™,对吧?:)感谢您的帮助!
相关文章:
- 如何用参数值调用函数(仅在运行时已知)
- 从python中调用C++函数并获取返回值
- 当使用通配符和null指针调用函数时,对输出的说明
- 从R调用C++函数并对其进行集成时出错
- 使用QTreeView,如何通过调用函数只突出显示特定的行/列
- 如何在qt中从另一个类调用函数
- 在 COUT 语句中使用 COUT 调用函数
- 如何从线程中的不同模块调用函数?
- C++从函数指针数组调用函数
- 当 A 在 for 循环中调用函数 B 时,如何计算函数 A 的空间复杂度?
- 如何在 C/C++ 中从外部库调用函数
- 如何使用运算符在同一行中多次调用函数
- 是否可以创建一个从不同类调用函数的线程?
- 无法为类成员调用函数
- 如何从另一个标头 c++ 调用函数
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 如何只允许在调用函数 B 后调用函数 A?
- 我可以这样调用函数吗?
- 如何在 c++ 的类中递归调用函数方法?
- 为什么在指向对象的迭代器上调用函数不允许我更改对象本身?