gpt4 book ai didi

c++ - 公开回调 API 的最佳方式是什么 - C++

转载 作者:行者123 更新时间:2023-11-30 01:31:44 25 4
gpt4 key购买 nike

我有一个 C++ 库,它应该公开一些系统\资源调用作为链接应用程序的回调。例如:接口(interface)应用程序(使用此库)可以发送套接字管理回调函数 - 发送、接收、打开、关闭等,库将使用此实现而不是库的实现。(这种方式使应用程序能够自行管理套接字,很有用)。这个库还必须公开更多的回调,例如密码验证,所以我想知道是否有一种首选方法可以在一个 API 中公开回调发送选项。像这样的东西:

int AddCallbackFunc (int functionCallbackType, <generic function prototype>, <generic way to pass some additional arguments>)

然后在我的库中,我将根据 functionCallbackType 参数将回调分配给适当的函数指针。

有没有办法以适合任何函数原型(prototype)和任何附加参数的通用方式实现它?

非常感谢您的帮助...谢谢!

最佳答案

为什么不让它接受一个 0 参数 functor并让用户在注册之前使用 boost::bind 将参数构建到其中?基本示例(调用而不是存储,但你明白了):

#include <tr1/functional>
#include <iostream>

void callback(const std::tr1::function<int()> &f) {
f();
}

int x() {
std::cout << "x" << std::endl;
return 0;
}

int y(int n) {
std::cout << "y = " << n << std::endl;
return 0;
}

int main(int argc, char *argv[]) {
callback(x);
callback(std::tr1::bind(y, 5));
}

编辑: 有一个选项 B,它基本上实现了 bind 在引擎盖下所做的事情,使用结构来存储所有需要的信息和多态性的继承......它很快就会变得一团糟.我不推荐它,但它会起作用。您还可以通过强制返回类型 int 来避免悲伤,但这只会为您节省一点点。

#include <iostream>

struct func_base {
virtual int operator()() = 0;
};

// make one of these for each arity function you want to support (boost does this up to 50 for you :-P
struct func0 : public func_base {
typedef int (*fptr_t)();

func0(fptr_t f) : fptr(f) {
}

virtual int operator()() { return fptr(); }

fptr_t fptr;
};

// demonstrates an arity of 1, templated so it can take any type of parameter
template <class T1>
struct func1 : public func_base {
typedef int (*fptr_t)(T1);

func1(fptr_t f, T1 a) : fptr(f), a1(a) {
}

virtual int operator()() { return fptr(a1); }

fptr_t fptr;
T1 a1;
};

void callback(func_base *f) {
(*f)();
}

int x() {
std::cout << "x" << std::endl;
return 0;
}

int y(int n) {
std::cout << "y = " << n << std::endl;
return 0;
}

int main(int argc, char *argv[]) {
// NOTE: memory leak here...
callback(new func0(x));
callback(new func1<int>(y, 5));
}

关于c++ - 公开回调 API 的最佳方式是什么 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2722658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com