我们能在c++中返回一个函数吗?
Can we return a function in C++?
我有一个包含三个函数的程序: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();
}
做同样的事情
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何仅为一个函数添加延迟
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 我需要将多个函数组合为一个函数
- 在C++中声明一个函数时,它需要有函数本身的参数吗
- 如何创建一个函数来计算并返回平均值、最大值和最小值
- 一个函数,用于查找字符串1包含字符串2 c++的次数
- 如何将一个类的函数作为另一个类的另一个函数的参数传递
- 编写一个函数以使用 n 百分比的 CPU 使用率
- 将 N-arg 函数包装到另一个函数中
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- C++(.cpp文件和.h文件)拆分代码并添加一个函数,提取 - 这很容易吗?
- C++从另一个函数退出函数
- 编写一个函数来删除单链表中的节点(尾部除外),仅授予对该节点的访问权限
- 视觉我希望一个函数在另一个函数C++中进行计算
- C ++如何在原始抽象类中创建一个函数,该函数接受派生类的输入
- 在另一个函数 (c++) 中调用变量
- 如何在另一个函数中使用返回值作为参数?
- 如何包装一个函数以适应另一个函数的所需类型
- 创建一个函数的 Python 绑定,返回指向带有 boost 的向量的指针