c++ - `boost::signals2` 中的信号签名是如何实现的?

标签 c++ templates boost implementation boost-signals2

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

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

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

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

最佳答案

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

typedef void Signature(bool, double);

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

using Signature = void(bool, double);

与函数指针并行的是:

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

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

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

关于c++ - `boost::signals2` 中的信号签名是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16558828/

相关文章:

c++ - 尝试运行指针排序算法时出现段错误(核心已转储)

android - Eclipse 中的 Android 项目缺少 "Add native support"

c++ - 将日期值分配给字符串(boost c++ 库,posix 时间)

c++ - 使用 Boost 的邻居边缘

c++ boost模板类型和非类型

c++ - 仅来自纯 C/C++ XLL 的 Excel 2010 功能区

c++ - 修改 const 对象的非常量成员

c++ - 请求 Pimpl 框架评论/建议

c++ - 模板类表达式参数重载

c++ - GCC 4.9 中的模板实例化错误,在 GCC 4.8 中工作正常