如何从函数返回指向函数的指针
how to return pointer to function from a function
我需要创建一个函数,该函数将返回指向另一个函数的指针作为结果,以便我可以在main()
中编写类似f(n)(v)
的东西。
例如"使向量 v 的函数,当调用时返回整数 n 上的函数,该函数返回计算 p(n(,其中 p 是多项式,系数来自向量 v",我想我可以通过此示例的示例代码理解所有内容。
另一个函数的主体应该在哪里?
你应该让自己熟悉lambdas。
这是你要求的实现(在 godbolt 上试试(:
#include <vector>
#include <cmath>
#include <iostream>
auto polynomial(const std::vector<float> &coeffs) {
return [=](float x){
float result = 0.f;
float exponent = 0.f;
for(const auto& c : coeffs) {
result += std::pow(x, exponent) * c;
exponent += 1.f;
}
return result;
};
}
int main() {
auto p = polynomial({1.f, 2.f, 3.f});
std::cout << p(5.f) << 'n'; // returns 86
}
这里正在发生的事情的基本描述:
lambda 表达式通过复制捕获所有内容(=
(,因此它会创建coeffs
向量的本地副本。由于 lambda 表达式的类型未知,因此您必须使用自动返回类型推导(或者可能是一些 decltype 构造(。
我需要创建一个函数,该函数将返回指向另一个函数的指针,以便我可以在
main()
中编写类似f(n)(v)
的东西。
想得更一般!让我稍微重新表述一下:您需要创建一个返回某些内容的函数,以便您可以在main()
中编写f(n)(v)
。
这个东西不一定是函数(或函数指针(。如果我们坚持这个语法f(n)(v)
,那么它肯定必须是一个可调用的。请注意,"可调用"可以是很多东西。我们所需要的只是某些对象F
可调用的是F(v)
对某些类型的v
有效。
一种相当传统的可调用对象类型是函子。函子是具有operator()
的类的对象。我不会赠送全套免费午餐,所以为了这个例子,我将自己限制为线性函数(多项式的扩展应该是直截了当的(。
我们从定义函子类开始:
struct linear_fun {
double a;
double b;
double operator()(double x) { return a + b*x; }
};
一旦我们有了这个,传递一个函数对象就非常简单了:
// returns a linear_fun that crosses the origin and the given point
linear_fun fun_crossing_point(double x,double y) {
return { 0.0 , y / x };
}
最后,我们想测试一下
int main() {
std::cout << fun_crossing_point( 1.1 , 5.0 )(1.1);
}
指纹:
5
请注意,还有 lambda,它们基本上是函子类的语法糖。当您只想在狭窄的范围内定义函子时,它们会派上用场。缺点是每个 lambda 都是不同类型的,所以当你想要一个特定的类型时,值得考虑自己编写函子类。
此外,C++还有std::function
,这是可调用对象的万能解决方案。它具有极大的灵活性,因为单个std::function
对象几乎可以分配任何类型的可调用对象。但是,这种灵活性需要一定的成本,通常不需要它。我认为您只需要定义一种定义多项式的类型,并且不需要混合例如自由函数,成员函数等。
- QMetaObject invokeMethod的基于函数指针的语法
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- c++r值引用应用于函数指针
- 模板函数指针和lambda
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 带有类的函数指针
- () 函子后面的括号,而不是函数指针?
- 全局作用域中函数指针的赋值
- 使用"Task"函数指针队列定义作业管理器
- 将成员函数指针作为参数传递给模板方法
- 如何创建对象函数指针C++映射?
- 匹配函数指针作为模板参数?
- 通过函数指针定义类范围之外的方法
- 存储在类中的函数指针
- C++从函数指针数组调用函数
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 整数键映射到头文件中的成员函数指针
- 从类成员函数到类 C 函数指针的转换
- 如何将内联匿名函数分配给C++函数指针
- 将字符缓冲区强制转换为函数指针