我正在开发一个使用回调系统的模块,但该系统的实现不是很好。客户端通过注册一个ID来接收回调,并将获得一个变量(或两个变量或没有变量)。问题在于几乎每个ID所对应的变量都是不同的。(例如:Id1 -> char*
,Id2 -> int
)。这是通过指针传递变量来实现的。因此,回调看起来像下面这样:
typedef void (*NotifFunctionPtr)(void* ctx, const void* option);
这种方法存在许多问题,我希望用一种类型安全且现代化的方式来处理它。然而,这并不像看起来那么简单,我有一些想法(如使用boost :: function或将void *替换为封装类型和ptr的结构体),但我认为可能有更好的想法,所以我想知道C ++中设置类型安全回调的现代方式是什么。
编辑:另一个想法是通过调用相同类型T的模板函数来注册具有类型T的回调。这可行吗?是否在库中实现?
boost::any
替换空指针。我强烈建议使用boost
或sigc++
分离信号,而不是使用 ID,但如果进行这么多重构不可行,boost::any
至少可以运行时检查你是否获得了正确的类型。 - Jan Hudecboost::any
将在运行时提供类型安全的解决方案,也就是说,如果您传递了错误类型的参数,它不会编译失败,但会在执行时失败。仍然比void*
和/或联合要好得多,因为它们会在未能匹配类型时悄悄地导致UB。 - David Rodríguez - dribeasT
注册回调并以相同的类型T
进行回调,您怎么看? - cprogrammer