我用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
声明一个真正的“类型”,是auto
抵达这个using
相同的扣除?
非常接近。简单''自动'衰减,所以你得到一个函数指针类型 - 'int(*)(Linked *)' –
既然你有答案,我想说我发现这个代码的问题有问题。有人会很难弄清楚这个“sumup”是什么。 – SergeyA
@SergeyA是真的,事实上,这是一个普遍的弱点,在任何语言中都有隐式类型推理。动态语言会变得更糟。我仍然发现我更喜欢明确的类型声明,除非这是很难知道的情况,最好留给编译器。 – johnbakers