Я использую boost::signals2
какое-то время сейчас в моих проектах. К своему стыду я до сих пор не понимаю, как они реализованы под капотом. Мои проблемы уже начинаются с самого определения сигнала. Как такое определение, как
boost::signals2::signal< void (bool, double) >
обрабатываются? Я могу видеть из деталей реализации, что подпись становится параметром шаблона с точным именем Signature
, Тем не менее, я не понимаю синтаксис. Разрешен ли этот синтаксис стандартом C ++? Как сигнал может «хранить» сигнатуру функции, если она указана в этой форме?
Я уже пытался посмотреть на источники, но не смог найти объяснение этому синтаксису. Любая помощь будет оценена.
Да, этот синтаксис разрешен; тип, который он обозначает, является ссылка на функцию, принимающую bool
а также double
и возвращаясь void
. Если бы мы были typedef
это было бы неловко, потому что имя будет посередине:
typedef void Signature(bool, double);
С новым псевдонимом синтаксис становится немного более читабельным:
using Signature = void(bool, double);
Параллель с указателями на функции будет:
typedef void (*Pointer)(bool, double);
using Pointer = void (*)(bool, double);
После этого существуют шаблоны трюков, позволяющие разделить различные элементы (извлечь тип возвращаемого значения и тип каждого аргумента).
// 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?