检查客户端在c++中是否设置了callback

checking whether callback is set by the client in C++

本文关键字:设置 callback 是否 客户端 c++ 检查      更新时间:2023-10-16

我有以下类

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

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

然而,当我试图编译它时,它抱怨"回调具有不完整的类型"。检查回调是否已经设置的最好方法是什么?如何改进上面的代码?

thank you

类型void基本上表示"没有"。一个函数的参数不能为0。你必须给它一个合适的类型。

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

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(...);
}

也许你是这个意思?

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;
    }
};

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

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

void的参数类型没有任何意义。它们是不合法的。唯一可以在C语言的参数列表中使用void的地方是当您希望函数完全不接受参数时,void myfunc(void)意味着将没有参数。

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