C 11中的高阶函数

C 11中的高阶函数,第1张

概述我正在使用C 11中提供的新的匿名函数来编写一个通用的折叠函数,这里是我所拥有的: template<typename T>T foldl(std::function<T(T,T)> f, T initial, std::vector<T> items) { T accum = initial; for(typename std::vector<T>::iterator it = 我正在使用C 11中提供的新的匿名函数来编写一个通用的折叠函数,这里是我所拥有的:
template<typename T>T foldl(std::function<T(T,T)> f,T initial,std::vector<T> items) {    T accum = initial;    for(typename std::vector<T>::iterator it = items.begin(); it != items.end(); ++it) {        accum = f(accum,(*it));    }    return accum;}

以下尝试使用它:

std::vector<int> arr;arr.assign(8,2);foldl([] (int x,int y) -> int { return x * y; },1,arr);

导致错误:

main.cpp:44:61: error: no matching function for call to 'foldl(main(int,char**)::<lambda(int,int)>,int,std::vector<int>&)'main.cpp:44:61: note: candIDate is:main.cpp:20:3: note: template<class T> T foldl(std::function<T(T,T)>,T,std::vector<T>)main.cpp:20:3: note:   template argument deduction/substitution Failed:main.cpp:44:61: note:   'main(int,int)>' is not derived from 'std::function<T(T,T)>'

在我看来,使用std ::函数不是正确的方法来定义f的类型.我该如何纠正?

解决方法 你的代码不是很通用.没有必要要求一个函数,矢量或任何类型的东西.一般来说,在C中,函数将在参数列表的末尾(对于lambdas尤其重要,因为它们可能很大).

所以这样做会更好(即:更标准)

template<typename Range,typename Accum>typename Range::value_type foldl(const Range &items,const typename Range::value_type &initial,Accum f){    typename Range::value_type accum = initial;    for(const auto &val : items) {        accum = f(accum,val);    }    return accum;}

或者你可以只是use std::accumulate这是完全相同的事情.

总结

以上是内存溢出为你收集整理的C 11中的高阶函数全部内容,希望文章能够帮你解决C 11中的高阶函数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1253619.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存