从函数中定义并返回一个函数?

时间:2015-11-19 16:47:01

标签: c++ function

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

例如,我们有一个函数:

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或类。是否有一种直接的方式来做到这一点而不必不必要地复杂化?

2 个答案:

答案 0 :(得分:5)

使用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);

答案 1 :(得分:3)

Closures(使用std::function) - 使用lambda functions - 在C ++ 11中是合适的,并在此处推荐。

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

然后您可能稍后编码:

 auto t3 = translate(3);

现在t3是&#34;功能&#34;这增加了3个,后来:

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

当然y为5,z为8。

您还可以使用一些JIT compilation库来动态生成机器代码,例如: GCCJIT,或LLVMlibjitasmjit;或者你甚至可以在一些生成的文件/tmp/mygencod.cc中生成一些C ++(或C)代码,并将其汇编(例如g++ -Wall -O -fPIC /tmp/mygencod.cc -shared -o /tmp/mygencod.so)分成/tmp/mygencod.so plugin然后{{ 3}}该插件在POSIX系统上使用dynamically load(以及后来dlopen从名称中获取函数指针;请注意C ++的dlsym。我正在name mangling

做这些事情