C ++例程返回函数

时间:2016-06-06 04:45:22

标签: c++11

我有以下代码可以正常工作。我想了解语法。 return语句有std::plus<double>()。 double over此处具有返回值数据类型。但函数定义的返回类型为std::function<double(double, double)>,表示两个双参数。这两者如何相互关联?

#include <functional>
#include <iostream>

using namespace std;

std::function<double(double, double)> GetFunction()
{
   return std::plus<double>();
}

int main()
{
   auto operation = GetFunction();

   int a = operation(1, 4);

   std::cout << std::plus<>{}(1, 4) << '\n';

   return 0;
}

3 个答案:

答案 0 :(得分:4)

存在从std::plus<double>std::function<double(double,double)>的隐式转换,因为前者具有成员调用运算符double operator()(double, double)。请参阅std::function constructors的文档。

答案 1 :(得分:2)

std::function<double(double, double)>

第一个double是函数的返回类型。您可以记住,通过实现它在左侧,就像在正常的函数定义中一样。

括号中的double是函数的参数类型,就像在普通函数定义中一样;减去参数名称。由于plus函数需要2 double s,因此有2个。

如果您考虑一下,这是有道理的。加号函数/运算符是二元运算符,意味着它接受一个类型的2个参数,并返回相同类型的单个值。这就是您在编写std::plus<double>时只需指定一种类型的原因;参数和返回类型必须是同一类型。强制调用者指定相同类型3次将是容易出错和无用的。

答案 2 :(得分:0)

如果您的问题是,为什么double的模板参数中只有一个std::plus,而std::function中的三个std::plus,则答案是:

对于std::function,两个参数和返回类型必须始终相同,因此您只需指定一次。
另一方面,.shell -ci "uf calc!WinMain" awk "{print $1} 可以使用任何参数和返回类型的组合来保存任何类似对象的函数,因此您必须基本上单独说明每个类型。