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

Автор: | 08.08.2018

Использование указателей может пригодиться при использовании большого количества однотипных функций, одна их которых выбирается в настройках эксперта или индикатора или для решения подобных задач.

Допустим, имеется две функции: функция сложения и умножения.

Функция сложения:

int add(int a,int b){
   return(a+1);
}

Функция умножения:

int mult(int a,int b){
   return(a+1);
}

Эти функции однотипны, то есть возвращают значения одинакового типа и имеют одинаковый набор параметров (их количество и типы). Необходимо, чтобы в зависимости от внешнего параметра работала одна или другая функция. Конечно, задачу можно решить используя if:

input bool DoAdd=true;
int func(int a,int b){ 
   if(DoAdd){
      return (add(a,b));
   }
   else{
      return (mult(a,b));
   }
}

Если функций всего две, то использование if будет более оптимальным решением и в плане простоты программирования и в плане быстродействия. Однако же, если функций много, допустим, несколько десятков, использование лестницы из if’ов может заметно снизить быстродействие кода. В этом случае на помощь приходят указатели на функции.

Первым шагом по использованию указателей на функцию является определение нового типа данных соответствующего типу функций. Определение типа начинается со слова typedef, затм идет указание возвращаемого функциями, в нашем случае это int, затем в круглых скобках сначала ставится знак * означающий, что это указатель, потом пишется название типа – произвольное слово, в конце, в круглых скобках перечисляются типы параметров, в нашем случае это (int,int):

typedef int(*fun)(int,int); 

Теперь объявляем переменную этого типа, имя переменной ptr:

fun ptr;

В начале работы эксперта или индикатора (в функции OnInit()), в зависимости от значения внешнего параметра DoAdd выбираем одну или другую функцию:

if(DoAdd){
   ptr=add;   
}
else{
   ptr=mult;         
}

Пользуясь указателем вызываем функцию:

int res= ptr(2,3); 

Скачать скрипт с примером: FunPtr