【问题标题】:Define and return a function from a function?从函数定义并返回函数?
【发布时间】:2015-11-19 16:47:01
【问题描述】:

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

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

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 或一个类。有没有一种直接的方法可以做到这一点而不会被不必要地复杂化?

【问题讨论】:

  • 你的意思是typedef float (*func_t)(float);? (注意 before func_t 的星号,而不是 after) Like:将 func_t 定义为一个指向接受 float 并返回 float 的函数的指针?
  • @NathanOliver 它在评论中说垃圾伪代码。可以肯定的是,除了人类编译器之外,任何人都清楚其意图。为了以防万一,添加了另一条评论。
  • @FabioTurati 是的,打错字了。
  • @NathanOliver - 我有点赶时间。感谢您的评论。 :D
  • 如果不使用 lambda 或类,就没有办法做到这一点——而且我不确定你想用它们做多少事情。添加 Lambda 的部分原因是允许按照您所追求的路线进行阴谋。

标签: c++ function


【解决方案1】:

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

【讨论】:

  • f 究竟接受哪些参数?返回值是多少?
  • @zehelvion 在这种情况下 f 是一个不接受任何参数且不返回值的函数。
  • 如果您能详细说明如何将其应用于我的问题的脉络中,那就太好了?
  • 如何定义返回 h 的 g(f, y) 其中 h(x) = f(x) + y;
  • @MohamadElghawi 您在错误的函数中使用了参数 coeff,希望您不介意我的编辑。顺便说一句,您不需要将f 存储为变量;可以直接退货。
【解决方案2】:

Closures (with std::function) - 在 C++11 中使用 lambda functions- 是合适的并且推荐在这里。也有

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 compilation 库来动态生成机器代码,例如GCCJIT,或LLVMlibjit,或asmjit;或者您甚至可以在某些生成的文件/tmp/mygencod.cc 中生成一些 C++(或 C)代码,并将其(例如 g++ -Wall -O -fPIC /tmp/mygencod.cc -shared -o /tmp/mygencod.so)的编译分叉成 /tmp/mygencod.so plugin 然后 dynamically load 使用 dlopen 的插件POSIX 系统(以及后来的 dlsym 从名称中获取函数指针;注意 C++ 的 name mangling)。我在GCC MELT做这样的事情

【讨论】:

  • 如果这是唯一有效的选项,你能否举一个简单的例子来做问题中的意图或类似的事情?如g(f, y) 返回h 其中h(x) = f(x) + y;
  • 我喜欢它更简洁。 wp
猜你喜欢
  • 1970-01-01
  • 2018-02-04
  • 2012-01-15
  • 2021-12-18
  • 2012-12-14
  • 2015-01-11
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多