Недавно заинтересовал вопрос: можно ли в C++ получить суперпозицию нескольких функций, как одну, самостоятельную функцию. Ответ: можно. Для этого используются указатели на функции и функторы. Функтором в С++ является класс, экземпляры которого интерпретируются, как функции. Делается это следующим образом: создаётся некоторый класс, у которого перегружается оператор (), в классе хранятся указатели на нужные функции, затем в операторе () происходит вычисление.
Простой пример: есть две функции они принимают float и возвращают float. Тогда класс, для суперпозиции таких функций можно записать, как:
Помоем, достаточно удобный аппарат, особенно для математических расчётов: программирование интегральных преобразований, зависящих от параметра, производных функции, расположений в ряды. В графике может использоваться, для преобразований координат. Вообще везде - для сокращения записи.
Явным минусом является то, что обращение к функции через указатель занимает достаточно время.
Простой пример: есть две функции они принимают 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.
Помоем, достаточно удобный аппарат, особенно для математических расчётов: программирование интегральных преобразований, зависящих от параметра, производных функции, расположений в ряды. В графике может использоваться, для преобразований координат. Вообще везде - для сокращения записи.
Явным минусом является то, что обращение к функции через указатель занимает достаточно время.