我们能在c++中返回一个函数吗?

Can we return a function in C++?

本文关键字:一个 函数 c++ 返回 我们      更新时间:2023-10-16

我有一个包含三个函数的程序:main(), returnFunction()functionToBeReturned()main()必须调用returnFunction()。可以使用functionToBeReturned()作为returnFunction()的返回值吗?

int functionToBeReturned()
{
    // some code here....
    return value;
}
int returnFunction()
{
    // some code here....
    return functionToBeReturned();
}
int main()
{
    returnFunction();
}

在C语言中,你可以拥有和返回函数指针;它们基本上指向你可以调用的机器码。你可能有一些库函数能够"创建"函数(例如动态生成或加载一些机器代码),并给出一个指向新创建代码的指针(dlsym, JIT库,....)。但是,在纯标准C99或C11或c++ 11中,没有办法在运行时创建原始的普通函数(在机器代码级别)。在限于标准 c++或C的程序中,函数集是固定的(并且是除NULL指针外所有指针函数都可以获得的值的集合)。由于C缺乏适当的闭包,许多C框架(例如GTK或其Glib, libevent, ....)处理回调,通过约定混合函数指针和客户端数据实现(例如,阅读GTK教程,参见g_signal_connect,…)

在c++ (c++ 11或更新版本)中,您还可以使用闭包,匿名函数(例如lambda-s)和std::function;例如

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

在返回的闭包中(它在语义上几乎表现为一个函数,因为您可以调用和应用它),delta是一个封闭的值。

闭包是一个极其重要和困难的概念,与lambda演算和函数式编程相关。要花几周的时间才能理解它,不要感到惊讶。参见Scheme, Lisp In Small Pieces, SICP....

对于一个非常相似的问题,这个答案给出了更多的细节。

在机器层面,C或c++函数指针通常是指向代码段的某个地址,但c++闭包是一些内部对象(某些"匿名"类的,在编译器实现内部),混合了代码指针和闭值或引用。

学习一些函数式编程语言,如Ocaml或Scheme或Clojure或Haskell或Common Lisp,将改善你的思维(即使是用C或c++编码)。

是的!函数指针是C和c++的一部分。使用函数指针,您可以从其他函数返回函数,并将它们存储在类中,等等。这里有一篇关于他们的文章。

#include <iostream>
using namespace std;
int functionToBeReturned() {
    cout << "hello!" << endl;
}
int (*returnFunction())() {
    // Observe how the parentheses around returnFunction distinguish a function
    // returning a function pointer from a normal function.
    return functionToBeReturned;
}
int main() {
    int (*function)();
    function = returnFunction();
    function();
}

在这个程序中,returnFunction是一个不接受任何参数的函数,它返回一个不接受任何参数并返回int类型的函数。涉及函数指针的声明在C和c++中真的很难看!为了清晰起见,您可以考虑这样做:

typedef int (*returns_int_t)();

为指向函数的指针定义了名称returns_int_t,该函数不接受任何参数,返回int类型。然后,你可以这样做:

#include <iostream>
using namespace std;
typedef int (*returns_int_t)();
int functionToBeReturned() {
    cout << "hello!" << endl;
}
returns_int_t returnFunction() {
    return functionToBeReturned;
}
int main() {
    returns_int_t function = returnFunction();
    function();
}

做同样的事情