Недавно заинтересовал вопрос: можно ли в 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.Помоем, достаточно удобный аппарат, особенно для математических расчётов: программирование интегральных преобразований, зависящих от параметра, производных функции, расположений в ряды. В графике может использоваться, для преобразований координат. Вообще везде - для сокращения записи.
Явным минусом является то, что обращение к функции через указатель занимает достаточно время.
Комментариев нет:
Отправить комментарий