Как вернуть указатель на функцию составной функции в C ++? - PullRequest
0 голосов
/ 17 декабря 2018

например, как превратить приведенный ниже код в matlab в эквивалентность c ++?

function g = Transform(funct, y)

         h = @(x) funct(x) +y;
         g = @(x) sign(h(x));
 end

приведенный выше код принимает функцию с именем "funct" и входное значение "y".Он выводит новую (преобразованную) функцию с именем g.

, использование которой в matlab будет

function main()
  for i = 1:5
     y = rand();
     funct = Tranform(funct,y);
  end

 disp(funct(1.27)); % after transformed 5 times

end

function z = funct(x)
     z = x;
end

1 Ответ

0 голосов
/ 17 декабря 2018

Можно, но выглядит немного более грязно.Для этого вы можете использовать лямбда-функции вместе с std :: function, например так:

#include <iostream>
#include <string>
#include <functional>


template <typename T> int sgn(T val)
{
    return (T(0) < val) - (val < T(0));
}

std::function<int(double)> transform(std::function<double(double)> funct, double y )
{
    std::function<int(double)> h = [=](double x) -> int
    {
        return sgn(funct(x) + y);
    };

    return h;
}


int main()
{
    auto f = [](double x) -> double { return x + 5.; };
    auto res = transform(f, 5.);
    std::cout << res(-15.) << std::endl;
}

Который выводит:

res (-10) -> 0

res (> -10) -> 1

res (<-10) -> -1

...