【问题标题】:How are signal signatures in `boost::signals2` implemented?`boost::signals2` 中的信号签名是如何实现的?
【发布时间】:2013-05-15 07:07:27
【问题描述】:

我在我的项目中使用boost::signals2 已经有一段时间了。令我感到羞耻的是,我仍然不明白它们是如何在后台实现的。我的问题已经从信号的定义开始了。如何定义如

boost::signals2::signal< void (bool, double) > 

处理?我可以从实现细节中看到,签名变成了一个模板参数,恰如其分地命名为Signature。但是,我不明白语法。 C++ 标准是否允许这种语法?以这种形式提供的信号如何“存储”函数签名?

我已经尝试查看源代码,但无法找到此语法的解释。任何帮助将不胜感激。

【问题讨论】:

  • 我猜Signature 被用作函数签名。 google-mock 使用相同的东西来描述和绑定模拟接口的函数签名,显然它是有效的语法。

标签: c++ templates boost implementation boost-signals2


【解决方案1】:

是的,这种语法是允许的;它表示的类型是一个对采用booldouble 并返回void 的函数的引用。如果我们要typedef它,那会很尴尬,因为名字会坐在中间:

typedef void Signature(bool, double);

使用新的别名语法变得更易读:

using Signature = void(bool, double);

与指向函数的指针类似的是:

typedef void (*Pointer)(bool, double);

using Pointer = void (*)(bool, double);

然后,有一些模板技巧来梳理各种元素(提取返回类型和每个参数的类型)。

【讨论】:

  • 谢谢!这就是我一直在寻找的。也许这是一个太宽泛的问题,但我怎样才能自己查找/学习这些东西?我尝试自己阅读 C++ 标准文档,但有没有“更简单”的方法?
  • C++ 标准可能是更难的方式。有几本“教程”或“高级”书籍,如果您查看 C++ 标记的描述,您将在此站点上获得有用问题的列表。其中一个值得注意的是list of books
【解决方案2】:
// In header: <boost/signals2/signal.hpp>
template<typename Signature, ... /* Omitted other args for clarity */> 
class signal : public boost::signals2::signal_base {
public:

  // In your case, typedef would be evaluated as
  //typedef void (bool, double) signature_type    
  typedef Signature  signature_type;    

有关 typedef 如何与函数指针一起使用的更多信息: Typedef function pointer?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 2011-12-18
    相关资源
    最近更新 更多