如何从函数返回指向函数的指针

how to return pointer to function from a function

本文关键字:函数 指针 返回      更新时间:2023-10-16

我需要创建一个函数,该函数将返回指向另一个函数的指针作为结果,以便我可以在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对象几乎可以分配任何类型的可调用对象。但是,这种灵活性需要一定的成本,通常不需要它。我认为您只需要定义一种定义多项式的类型,并且不需要混合例如自由函数,成员函数等。