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

时间:2011-10-24 08:05:44

标签: c++ templates boost callback

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

typedef void (*NotifFunctionPtr)(void* ctx, const void* option);

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

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

3 个答案:

答案 0 :(得分:10)

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

解决了这个问题后,您可以使用signalssignals2库,或者使用function作为基础实现自己的轮子(以避免重写类型擦除)

答案 1 :(得分:3)

boost::function在这里是正确的选择。您可以获得函数对象的类型安全性,而无需更改代码。

答案 2 :(得分:2)

如果你已经考虑过提升。为什么不使用signalssignals2库。