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

C++ 如何从函数返回指向函数的指针,c++,c++11,C++,C++11,我需要创建一个函数,它将返回一个指向另一个函数的指针,这样我就可以在main中编写类似fnv的东西 例如,当调用向量v的函数时,返回一个整数n上的函数,其中返回的函数计算pn,其中p是向量v系数的多项式,我想我可以通过这个例子的示例代码理解所有内容 其他函数的主体应该在哪里?您应该熟悉 这是您要求试用的实现: 这里发生的事情的基本描述: lambda表达式通过复制捕获所有内容,因此它创建了系数向量的本地副本。由于lambda表达式的类型未知,因此必须使用自动返回类型推断或某些decltype构造

我需要创建一个函数,它将返回一个指向另一个函数的指针,这样我就可以在main中编写类似fnv的东西

例如,当调用向量v的函数时,返回一个整数n上的函数,其中返回的函数计算pn,其中p是向量v系数的多项式,我想我可以通过这个例子的示例代码理解所有内容


其他函数的主体应该在哪里?

您应该熟悉

这是您要求试用的实现:

这里发生的事情的基本描述:

lambda表达式通过复制捕获所有内容,因此它创建了系数向量的本地副本。由于lambda表达式的类型未知,因此必须使用自动返回类型推断或某些decltype构造

我需要创建一个函数,它将返回一个指向另一个函数的指针,这样我就可以在main中编写类似fnv的东西

多想想!让我重新表述一下:您需要创建一个返回某些内容的函数,以便可以在main中编写fnv

这不一定是函数或函数指针。如果我们坚持这种语法fnv,那么它肯定是可调用的。请注意,callable可以是很多东西。我们需要的是,对于某些类型的v,Fv是有效的

一种相当传统的可调用函数是函子。函子是具有运算符的类的对象。我不想免费赠送一顿丰盛的午餐,所以为了这个例子,我将把自己限制在线性函数上,多项式的扩展应该是直截了当的

我们首先定义函子类:

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);    
}
注意,还有lambda,它们基本上是函子类的语法糖。当你只想在一个狭窄的范围内定义函子时,它们就派上了用场。缺点是每一个lambda都是不同类型的,所以当你想要一个特定类型时,就值得考虑自己编写函子类。

C++也有STD:函数,它是可调用的捕获所有解决方案。它具有很大的灵活性,因为一个std::function对象几乎可以被分配任何类型的可调用对象。然而,这种灵活性需要付出一定的代价,通常人们并不需要它。我假设你只需要定义一种定义多项式的类型,而不需要混合自由函数、成员函数和其他函数

您可能想了解。您好,欢迎来到StackOverflow。请花些时间阅读帮助页面,特别是命名和的部分。更重要的是,请阅读。你可能还想了解First place,如果有人对语言有疑问,那人通常是长相的,是的。是的,我试过了,但一切都解释得很糟糕。你发给我的这个东西只谈到函数指针,而不是我在这个例子中给你的问题。我的经验法则是,只有在我确实需要std::function提供的灵活性时才使用它,即:存储任何类型的可调用函数,虽然当我只需要一种特定类型的可呼叫电话时,我不想为我不使用的东西付费。只是别忘了std::函数附带了一些overhead@formerlyknownas_463035818:当您需要一种特定的可调用类型时,您将怎么做?用自由函数污染全局名称空间以允许它们通过指针返回它们?我不同意你的看法,我使用std::function,然后在必要时将其更改为更有效的功能。您的优化看起来有些过早。@eike:不清楚他是反对一般使用匿名函数,还是仅仅在返回类型上指定std::function强制,这就是我问题的原因。@Jack对于多项式,我可能会编写一个函子类来封装系数,并有一个运算符。很抱歉在评论中进行了详细的讨论。我写了一个答案,希望我的评论更清楚
int main() {
    std::cout << fun_crossing_point( 1.1 , 5.0 )(1.1);    
}
5