如何实现`boost :: signals2`中的信号签名?

时间:2013-05-15 07:07:27

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

typedef void Signature(bool, double);

使用新的别名语法会变得更具可读性:

using Signature = void(bool, double);

与函数指针的并行是:

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

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

之后,有一些模板技巧可以分解各种元素(提取返回类型和每个参数的类型)。

答案 1 :(得分: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 function pointer?