将auto用于已定义的函数

时间:2016-02-11 14:40:49

标签: c++ templates c++11

我已经使用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达到相同的推论?

2 个答案:

答案 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使定义更具可读性。