Стало интересно, можно ли в C/C++ реализовать суперпозицию функций через указатели на них. А точнее получить функцию, являющийся суперпозицией двух.
Например есть функции
float one(float x);
float two(float x);
Надо получить такую функцию float r(float x), что r будет высчитываться, как two(one(x)).
Самый подвох, что функции two и one могут быть произвольные(с точностью до типа, т.е. всегда принимают float и возвращают float, что происходит в теле функции условно не известно).
Что я пытаюсь делать:
typedef float(*nw)(float);
nw func(float (*a)(float),float(*b)(float)){
nw r = &(b(a));
return r;
}
float one(float x);
float two(float x);
int main(){
nw r = func(one, two)
...
return 0;
}
Компилятор выдаёт ошибки в строчке nw r = &(b(a));, что невозможно преобразовать параметр 1 из 'float (__cdecl *)(float) ну и что для & необходимо левостороннее значение. Если не писать амперсанд, то выдает ошибку что невозможно преобразовать из float в nw.
Пытался писать так:
nw func(float (*a)(float x),float(*b)(float)){
nw r = b(a(x));
return r;
}
nw func(float (*a)(float x),float(*b)(float)){
nw r = b((*a));
return r;
}
Везде ошибки.
И собственно вопрос: такое вообще возможно и как?
Видел варианты через преоопределие структур и перегрузку оператора (), но мне интересно можно ли обойтись без них?
Примечание:
Кэп.О, хм. И правда поработав с функторами я сделал то что хотел.
Вот, что получилось:
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;
};
И пример:
functest r(one,two);
float x = r(1);
Удобно. Большое спасибо.
RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.