6

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

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

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

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

4

2 回答 2

2

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

typedef void Signature(bool, double);

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

using Signature = void(bool, double);

与指向函数的指针平行的是:

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

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

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

于 2013-05-15T07:44:39.733 回答
0
// 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 函数指针?

于 2013-05-15T07:23:36.673 回答