Как реализованы сигнатуры сигналов в `boost :: signal2`?

Я использую boost::signals2 какое-то время сейчас в моих проектах. К своему стыду я до сих пор не понимаю, как они реализованы под капотом. Мои проблемы уже начинаются с самого определения сигнала. Как такое определение, как

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

обрабатываются? Я могу видеть из деталей реализации, что подпись становится параметром шаблона с точным именем Signature, Тем не менее, я не понимаю синтаксис. Разрешен ли этот синтаксис стандартом C ++? Как сигнал может «хранить» сигнатуру функции, если она указана в этой форме?

Я уже пытался посмотреть на источники, но не смог найти объяснение этому синтаксису. Любая помощь будет оценена.

6

Решение

Да, этот синтаксис разрешен; тип, который он обозначает, является ссылка на функцию, принимающую bool а также double и возвращаясь void. Если бы мы были typedef это было бы неловко, потому что имя будет посередине:

typedef void Signature(bool, double);

С новым псевдонимом синтаксис становится немного более читабельным:

using Signature = void(bool, double);

Параллель с указателями на функции будет:

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

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

После этого существуют шаблоны трюков, позволяющие разделить различные элементы (извлечь тип возвращаемого значения и тип каждого аргумента).

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?

0