我有以下代码可以正常工作。我想了解语法。 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;
}
答案 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}
可以使用任何参数和返回类型的组合来保存任何类似对象的函数,因此您必须基本上单独说明每个类型。