Указатели функций-членов и наиболее быстрые делегаты C++ - Указатели функций

ОГЛАВЛЕНИЕ

Указатели функций

Мы начнем с обзора указателей функций. В C и, следовательно, в C++ указатель функции, названный my_func_ptr, который указывает на функцию, принимающую int и char * и возвращающую float, объявляется таким образом:

float (*my_func_ptr)(int, char *);
// Чтобы сделать это более понятным, рекомендуется использовать переименование типов.
// Код становится запутанным, когда
// указатель функции – это параметр функции.
// Объявление могло бы выглядеть таким образом:
typedef float (*MyFuncPtrType)(int, char *);
MyFuncPtrType my_func_ptr;

Учтите, что есть различные типы указателя функции для каждой комбинации аргументов. В MSVC также есть различные типы для каждого из трех различных соглашений о вызовах: __cdecl, __stdcall и __fastcall. Вы заставляете ваш указатель функции указывать на функцию float some_func(int, char *) таким образом:

 my_func_ptr = some_func;

Когда вам нужно вызвать сохраненную функцию, вы делаете так:

 (*my_func_ptr)(7, "Arbitrary String");

Вы можете приводить указатель функции одного типа к другому типу. Но вы не можете приводить указатель функции к указателю данных типа void *. Другие допустимые операции тривиальны. Указатель функции можно установить в 0, чтобы пометить его как пустой указатель. Доступен полный диапазон операторов сравнения (==, !=, <, >, <=, >=), и вы также можете проверить работу пустых указателей, используя ==0, или с помощью неявного преобразования типа в bool. Любопытно, что указатель функции может использоваться в качестве нетипированного параметра шаблона. Он полностью отличается от параметра типа и также отличается от интегрального нетипированного параметра. Его реализация основана на имени, а не на типе или значении. Основанные на имени параметры шаблона не поддерживаются всеми компиляторами, даже не все те, которые поддерживают частичную специализацию шаблона.

В C указатели функций чаще всего используются в качестве параметров для библиотечных функций типа qsort и как обратные вызовы для функций Windows и т.д. Они также имеют много других применений. Реализация указателей функций простая: они являются "указателями кода": они содержат начальный адрес процедуры на языке ассемблера. Различные типы указателей функций существуют только для того, чтобы убедиться, что применяется правильное соглашение о вызове.