我正在使用一个未实现非常好的回调系统的模块。客户端正在使用ID注册,并将使用变量(或两个或无)变回。问题是几乎每个ID都是一个不同的变量。 (例如:Id1 - > char*
,Id2 - > int
)。这是通过指针传递变量来实现的。所以回调看起来像
typedef void (*NotifFunctionPtr)(void* ctx, const void* option);
这种方法有很多问题,我希望用(类型)安全和现代的方式来替换它。然而,这并不像它看起来那么简单,我有一些想法(like boost::function
或用一个封装类型和ptr的结构替换void*
但我想也许有一个更好的主意,所以我想知道在C ++中设置类型安全回调的现代方法是什么。
编辑:另一个想法是通过模板函数注册一个类型为T的回调,该函数使用相同的类型T回调。这是可行的还是在库中实现的?
答案 0 :(得分:10)
您的问题不是回调,而是您希望将所有回调视为相同类型,而不是(签名不同)。所以要么你做了讨厌的C void*
技巧,要么你想使用类型安全的方法,你将不得不为它付费,并提供不同的方法来注册不同的回调类型 - - 恕我直言是正确的方式。
解决了这个问题后,您可以使用signals
或signals2
库,或者使用function
作为基础实现自己的轮子(以避免重写类型擦除)
答案 1 :(得分:3)
boost::function
在这里是正确的选择。您可以获得函数对象的类型安全性,而无需更改代码。
答案 2 :(得分:2)