如何在函数内定义和返回函数?
例如,我们有一个函数:
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或类。是否有一种直接的方式来做到这一点而不必不必要地复杂化?
答案 0 :(得分:5)
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,或LLVM或libjit或asmjit;或者你甚至可以在一些生成的文件/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