现代C++中的Typesafe回调系统

cpr*_*mer 4 c++ templates boost callback

我正在使用一个未实现非常好的回调系统的模块.客户端正在使用ID注册,并将使用变量(或两个或无)变回.问题是几乎每个ID都是一个不同的变量.(例如:Id1 - > char*,Id2 - > int).这是通过指针传递变量来实现的.所以回调看起来像

typedef void (*NotifFunctionPtr)(void* ctx, const void* option);
Run Code Online (Sandbox Code Playgroud)

这种方法有很多问题,我希望用(类型)安全和现代的方式来替换它.然而,这并不像它看起来那么简单,我有一些想法(like boost::function或用void*一个封装类型和ptr的结构代替)但我想也许有更好的主意,所以我想知道什么是现代的设置方式C++中的类型安全回调.

编辑:另一个想法是通过模板函数注册一个类型为T的回调,该函数使用相同的类型T回调.这是可行的还是在库中实现的?

Dav*_*eas 10

您的问题不是回调问题,而是您希望将所有回调视为相同类型,而不是(签名不同).因此要么你做了讨厌的C void*技巧,要么你想使用类型安全的方法,你将不得不为它付费,并提供不同的方法来注册不同的回调类型 - 恕我直言是正确的方法.

一旦你解决了这个问题,就可以使用signals或者signals2库来实现你自己的轮子function作为基础(避免重写类型擦除).

  • 还有一个用`boost :: any`替换void指针的选项.我肯定会建议使用ID的任何信号(使用boost或sigc ++),但如果那么多重构不可行,`boost :: any`至少会允许运行时检查你得到的是正确的类型. (4认同)
  • @JanHudec:是的,这是真的,`boost :: any`将在运行时*提供*类型安全*解决方案*,也就是说,它将无法编译,但如果传递错误类型的参数则无法执行.仍然比`void*`和/或unions好得多,如果你不能匹配类型,它们会默默地导致UB. (2认同)