среда, 21 марта 2012 г.

C++ суперпозиция функций, функторы

Недавно заинтересовал вопрос: можно ли в C++ получить суперпозицию нескольких функций, как одну, самостоятельную функцию. Ответ: можно. Для этого используются указатели на функции и функторы. Функтором в С++ является класс, экземпляры которого интерпретируются, как функции. Делается это следующим образом: создаётся некоторый класс, у которого перегружается оператор (), в классе хранятся указатели на нужные функции, затем в операторе () происходит вычисление.
Простой пример: есть две функции они принимают float и возвращают float. Тогда класс, для суперпозиции таких функций можно записать, как:
typedef float(*nw)(float);

class functest{
 public:
 functest(){
  a = 0;
  b = 0;
 }
 functest(nw a1, nw b1){
  a = a1;
  b = b1;
 }
 void setfn(nw a1, nw b1){
  a = a1;
  b = b1;
 }
 float operator ()(float t){
  return b(a(t));
 }
 private:
 nw a, b;
};
Пример использования:
float one(float x){
 return x + 1;
}

float two(float b){
 return 2*b;
}

int main(){

 functest r(one,two), r1(two, one);
 float x = r(2);
 float x1 = r1(2);
 printf("%f %f",x,x1);
 getch();

}
Результатом работы программы будет x = 6, x1 = 5.
Помоем, достаточно удобный аппарат, особенно для математических расчётов: программирование интегральных преобразований, зависящих от параметра, производных функции, расположений в ряды. В графике может использоваться, для преобразований координат. Вообще везде - для сокращения записи.
Явным минусом является то, что обращение к функции через указатель занимает достаточно время.

Комментариев нет:

Отправить комментарий