构造函数接受并设置具有以下类型的成员:
void (*callBackFunc)(void *context, VideoSprite *pCaller)
现在我需要扩展它以包含比VideoSprite
保持更多的数据。我会在static_cast
回调中static
这样:
static void staticFuncToInitRot(void *context, VideoSprite *pCaller)
{
spinningSprite *winSpin = static_cast<spinningSprite*>(pCaller);
这可以吗?没有切片风险或任何难以检测的东西?你也可以告诉我将调用哪个c&tor?为什么?
DelayedCallback(void *context, VideoSprite *pCaller, std::function<void(void *context, VideoSprite *pCaller)> lambda) :
lambda(lambda),
callBackFunc(NULL),
context(context),
pCaller(pCaller),
{}
DelayedCallback(void *context, VideoSprite *pCaller, void (*callBackFunc)(void *context, VideoSprite *pCaller)) :
callBackFunc(callBackFunc),
context(context),
pCaller(pCaller),
{}
只有一个替代成员NULL
ified,因为回调执行时为:
if (callBackFunc) callBackFunc(context, pCaller);
else lambda(context, pCaller);
我无法记住我是否需要lambda
或将其留在那里以获得未来的证明效益。
来自VideoSprite
的{{1}}是context
nullptr
其中actionList.push_back(new DelayedCallback(context, this, callBackFunc));
是指向
callBackFunc
我真的不需要static void staticFuncToInitRot(void *context, VideoSprite *pCaller)
感谢,感谢您的关注。
答案 0 :(得分:1)
static void staticFuncToInitRot(void *context, VideoSprite *pCaller)
{
spinningSprite *winSpin = static_cast<spinningSprite*>(pCaller);
这可以吗?没有切片风险或任何难以检测的东西?你还可以告诉我将要调用哪个c'tor以及为什么?
最好做一个dynamic_cast
,以确保您不会意外地将VideoSprite
的另一个子类型转换为spinningSprite
,并假设它是有效的演员。
static void staticFuncToInitRot(void *context, VideoSprite *pCaller)
{
spinningSprite *winSpin = dynamic_cast<spinningSprite*>(pCaller);
if ( winSpin )
{
// Safe to use the pointer
}
}
关于调用哪个构造函数...
使用时:
actionList.push_back(new DelayedCallback(context, this, callBackFunc));
将调用第二个构造函数。我不知道为什么你觉得它含糊不清。第二个构造函数接受一个参数,其类型与正在使用的参数直接匹配。
您可以使用
强制使用第一个构造函数actionList.push_back(new DelayedCallback(context, this, std::function<void(void *, VideoSprite *)>(callBackFunc)));