我已经使用auto
来存储在自动分配中构建的lambda,但今天我正在查看this interesting paper on functional programming using c++ templates并遇到此代码:
template < typename T , typename Ops >
T fold ( Linked <T > * p )
{
T acc = Ops :: initial () ;
while ( p ) {
acc = Ops :: bin ( acc , p - > head ) ;
p = p - > tail ;
}
return acc ;
}
// later, in main():
auto sumup = fold <int , IntOps >;
我试图理解sumup
的类型是什么,因为它不是分配给fold
的输出而是分配给实际的函数fold
本身!我决定查看auto
展示使用的各种方式here。我假设auto
的使用属于该页面上的(1)
,这是一个通用变量初始值设定项。不清楚的是sumup
的类型是什么?
而且,auto
可能与此相同:
using functionType = int (Linked<int>*);
functionType sumup = fold <int , IntOps >;
这可能不正确,但如果我的想法朝着正确的方向发展,我会感到好奇。实例化时,fold <int , IntOps >
将是一个返回int
并且使用Linked<int>*
的单个参数的函数,所以我的using
声明说同样的事情?这个using
声明是真实的&#34;类型&#34; auto
是否与此using
达到相同的推论?
答案 0 :(得分:1)
auto
使用与template argument deduction相同的规则。也就是说,当不合格时,它会以价值为基础。由于这里你返回一个函数引用,它必须衰减到一个指针,因为函数没有“值类型”,具有特定的大小等等。
您还可以使用auto&&
进行捕获,这将使sumup
的类型为int (&)(Linked<int>*)
,即对该函数的引用。
答案 1 :(得分:1)
虽然每个函数都有一个类型,但您不能拥有该类型的表达式,也不能拥有变量。因此,int foo(float)
具有类型int(float)
,但您不能拥有该类型的变量。
你可以拥有类型指向功能的表达式和变量,所以int(*)(float)
。例如,&foo
就是指向函数的指针。
显然,这两种类型密切相关。实际上,转化是隐含的:int (*pFoo)(float) = foo;
会自动进行转化。
你在这里做的几乎是一样的:int (*sumup)(Linked<int>*) = fold <int , IntOps >;
。您看到auto
使定义更具可读性。