我已经在我的项目中使用boost::signals2
一段时间了。令我感到羞耻的是,我仍然不明白它们是如何实现的引擎盖。我的问题已经从信号的定义开始了。如何定义如
boost::signals2::signal< void (bool, double) >
处理?我可以从实现细节中看到签名成为一个名为Signature
的模板参数。但是,我不懂语法。 C ++标准是否允许这种语法?如果以这种形式提供功能签名,信号如何“存储”?
我已经尝试查看源代码,但无法找到此语法的解释。任何帮助将不胜感激。
答案 0 :(得分:2)
是的,允许这种语法;它表示的类型是对函数的引用,它引用bool
和double
并返回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?