在c++中使用回调



我正在用c++做一个项目,但是在应用程序的某个时候它失败了,并生成了一个核心转储。该应用程序使用了几个类,这里我将重点关注其中一个类,我将其称为a,并将其实例化为对象a。这有大量的成员函数,目前只有少数几个被使用,但其中一个生成日志以生成用于调试的诊断。我想用它来找出应用程序失败的原因。

项目是把调用各种成员函数的代码放在一起,尽管我可以访问源代码和一些有限的文档,但是没有任何代码可以更改,所有更改都在使用类和调用成员函数的代码中。该成员函数是:

void enable_log (log_callback callback, void * user_data = nullptr)

其中第一个参数回调包含消息,第二个参数是可选的。现在它可以被设置为nullptr,因此将被调用为:

a.enable_log(callback, nullptr);

从本文档中,根本不清楚回调到底是什么。但是,在查看源代码时,这是:

using log_callback = void (*)(const std::string& message, void* user_data);

头文件中的,其中log_callback是const std::string&如果我理解正确的话。

我已经在使用Visual Studio 2019的平台上有了虚拟类,其中有一些测试成员函数来模拟调用远程Linux服务器上的成员函数,但我无法找到使用上述成员函数的方法。我将test成员函数添加到虚拟类中,如下所示:

void enable_log(const std::string& callback, void* user_data = nullptr) {
callback = "ABCD";
}

,它应该生成一个返回的测试字符串,这样在实际应用程序中,该字符串将具有将被写入文件的诊断信息。然而,"="是一个错误。

这个想法是在main函数中声明一个空字符串,然后enable_log()应该填充这个字符串,它可以被打印出来。

我花了一些时间查看各种资源,包括Stackoverflow,但我找不到一种返回字符串的方法,其中包含可以打印出来的信息。我需要一种简单的方法来模拟这一点,正如我上面所说的,我不能改变真实成员函数的源代码,所以模拟的成员函数必须以同样的方式产生一个字符串。这是如何做到的呢?如能给点建议,不胜感激。

回调,简单来说,就是稍后在某个时刻调用的某个函数。例子:

void callback_fn(int a);
using callback_t = (void)(*)(int a);
void some_func(callback_t);

您可以这样使用some_func():

some_func(callback_fn);

完整示例如下:https://godbolt.org/z/ET3GhfYrv

对于您的使用,回调的参数略有不同。下面是阅读语法的方法:

using log_callback = // this just creates an alias for whatever is on the right handside
void // the return type of the "callable" should be void
(*) // this tells us that it is a function pointer
(const std::string& message, void* user_data) // These are the arguments the callable takes. It is a "std::string" and a "void *"
要使用它,只需创建一个具有相同签名的自由函数:
void callable(const std::string &msg, void *userData = nullptr)
{
// msg is the data sent by the function. use it in whatever way
// you want.
std::cout << msg << 'n';
}
// Pass it to the enable_log
enable_log(callable);

最新更新