我有一个指向参数化函数的成员,我可以扩展参数类型吗?

时间:2014-12-11 15:37:33

标签: c++ lambda function-pointers

构造函数接受并设置具有以下类型的成员:

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) 感谢,感谢您的关注。

1 个答案:

答案 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)));