0

我有以下课程

class msg{
//other stuffs before
        void (*callback)(void *);
    bool callback_check(const msg_type_e, void callback);
}

这个想法基本上是调用“callback_check”函数来查看客户端是否已经设置了“回调”。如果设置了,那么callback_check 将做内部处理,这就是为什么我想到将“callback”作为“callback_check”函数的参数传递。

但是,当我尝试编译它时,它抱怨“回调的类型不完整”。检查是否已设置回调的最佳方法是什么?如何改进上面的代码?

谢谢你

4

3 回答 3

2

也许你的意思是这样的?

class msg{
    typedef void (*callback_t)(void *);

    bool callback_check(callback_t callback);
};

void callback尝试声明一个类型的参数void(与您之前声明的函数指针无关callback),这是非法的。

void (*callback)(void *);是指向函数的类型指针的成员声明。如果这是您的意图,则无需将其传递给成员函数。你可以这样做:

class msg{
    void (*callback)(void *);
    bool callback_check()
    {
        return callback != nullptr;
    }
};
于 2013-05-07T11:49:55.930 回答
2

该类型void基本上意味着“无”。而且你不能对一个什么都不是的函数有一个参数。你必须给它一个正确的类型。

如果它应该是实际的回调函数,则将其声明为函数指针,例如:

bool callback_check(const msg_type_e, void (*callback)(void*));

但是,我建议您std::function改用,因为这样您就可以传递所有类型的函数(例如 lambdas、借助std::bind与签名匹配的其他可调用对象的成员函数):

bool callback_check(const msg_type_e, std::function<void(void*)> callback);

当然,你应该让callback类中的成员也成为一个std::function对象。


现在要检查一个std::function对象是否有一个有效的可调用“函数”分配给它,该类有一个布尔运算符,因此它可以在布尔表达式中使用。喜欢:

if (this->callback)
{
    // Callback should be callable
    this->callback(...);
}
于 2013-05-07T11:50:15.873 回答
0

您的callback参数完全错误。它应该是这样的:

class msg{
//other stuffs before
        typedef void (*callback)(void *);
    bool callback_check(const msg_type_e, callback cb);
}

参数类型void并不意味着什么。他们是不合法的。您可以void在 C 中的参数列表中使用的唯一位置是当您希望函数完全不带参数时,这void myfunc(void)意味着将没有参数。

您可以传递给函数的类型void*是指向 的指针void,这意味着指向的类型没有与之关联的类型。请注意,指向 void 的指针与void自身完全不同。

于 2013-05-07T11:50:25.130 回答