定义函数并从函数返回函数

Define and return a function from a function?

本文关键字:函数 返回 定义      更新时间:2023-10-16

如何在函数内定义和返回函数?

例如,我们有一个这样的函数:

float foo(float val) {return val * val;}

现在,需要的是像 bar 这样的函数:

typedef float (*func_t)(float)
// Rubish pseudo code
func_t bar(float coeff) {return coeff * foo();}
// Real intention, create a function that returns a variant of foo
//  that is multiplied by coeff. h(x) = coeff * foo(x)

到目前为止,我想出的唯一办法是使用 lambda 或类。有没有一种直接的方法可以做到这一点,而不会造成不必要的复杂?

使用 std::function

std::function<float(float)> bar(float coeff)
{
    auto f = [coeff](float x)
    {
        return coeff * foo(x);
    };
    return f;
}

然后,您将像这样使用它:

auto f = bar(coeff);
auto result = f(x);

C++11 中使用 lambda 函数的闭包(带 std::function(是合适的,建议在这里使用。所以有

std::function<int(int)> translate (int delta) { 
   return [delta](int x) {return x+delta;} }

然后,您可以稍后编写代码:

 auto t3 = translate(3);

现在t3是"函数",稍后添加 3:

 int y = t3(2), z = t3(5);

当然,y必须是5,z是8。

你也可以使用一些JIT编译库来动态生成机器代码,例如GCCJIT,LLVM或libjit,或asmjit;或者你甚至可以在一些生成的文件中生成一些C++(或C(代码/tmp/mygencod.cc并分叉编译(例如 g++ -Wall -O -fPIC /tmp/mygencod.cc -shared -o /tmp/mygencod.so ( 到一个/tmp/mygencod.so插件中,然后在 POSIX 系统上使用 dlopen 动态加载该插件(后来使用 dlsym 从名称中获取函数指针;当心名称重整C++(。我在GCC MELT中做这样的事情