声明:本文参考了Alex Allain的文章http://www.cprogramming.com/c++11/c++11-lambda-closures.html
加入了自己的理解,不是简单的翻译
C++11终于知道要在语言中加入匿名函数了。匿名函数在很多时候可以为编码提供便利,这在下文会提到。很多语言中的匿名函数,如C++,都是用Lambda表达式实现的。Lambda表达式又称为lambda函数。我在下文中称之为Lambda函数。
为了明白Lambda函数的用处,请务必先搞明白C++中的自动类型推断:http://blog.csdn.net/srzhz/article/details/7934483
2013-05-28 13:15:49| 分类: learning | 标签:c++11 |举报 |字号大中小 订阅
// Declare graph of factor types and build the factor structure std::vector<dtf::prior_t> priors; float tree_ms = ts::timing_ms([&]() { graph = InitFactorGraph(forest, priors, dags_train, sigma_unary, sigma_pw, levels_unary, levels_pw, feat_box_max, feat_radius); }); std::cout << "Decision tree induction took " << (tree_ms/1000.0) << "s" << std::endl;
我的感觉就是return processFrames([&](cv::Mat frame) { cv::Mat withoutBackground = bgHider.process(frame); cv::Mat eroded; cv::erode(withoutBackground, eroded, cv::Mat(), cv::Point(-1,-1), 3); cv::Mat dilated; cv::dilate(eroded, dilated, cv::Mat(), cv::Point(-1,-1), 5); //cv::Mat processed = redFilter.filter(withoutBackground); cv::Mat* showImage = 0; switch (showStage) { case 0: showImage = &frame; break; case 1: showImage = &withoutBackground; break; case 2: showImage = &eroded; break; case 3: showImage = &dilated; break; default: showImage = 0; } if (showImage) { std::ostringstream oss; auto millis = stopWatch.getMillisAndReset(); oss << 1000/millis; cv::putText(*showImage, oss.str(),cv::Point(30,frame.rows-30), cv::FONT_HERSHEY_COMPLEX_SMALL, 0.8, cv::Scalar(200,200,250),1,CV_AA); cv::imshow(BGName, bgHider.backgroundEstimate()); cv::imshow(TrackerName, *showImage); } });
变成这样vector
vec; vector ::iterator itr = vec.iterator();
vector
vec; auto itr = vec.iterator();
变成这样Person::PersonType Person::getPersonType () { return _person_type; }
auto Person::getPersonType () -> PersonType { return _person_type; }
看上去都是一些简单的卖弄技巧的东西啊,不过他们组合起来就变成酱紫:int x = 3; decltype(x) y = x; // same thing as auto y = x;
这样就为代码带来很大的方便了,尤其是lambda中。template <typename Builder> auto makeAndProcessObject (const Builder& builder) -> decltype( builder.makeObject() ) { auto val = builder.makeObject(); // do stuff with val return val; }
captures的选项有这些:[captures] (params) -> ret {Statments;}
----------我是回溯分割线--------[] () -> int { return 1; }
首先ts::timing_ms是一个模板函数返回float:// Declare graph of factor types and build the factor structure std::vector<dtf::prior_t> priors; float tree_ms = ts::timing_ms([&]() { graph = InitFactorGraph(forest, priors, dags_train, sigma_unary, sigma_pw, levels_unary, levels_pw, feat_box_max, feat_radius); }); std::cout << "Decision tree induction took " << (tree_ms/1000.0) << "s" << std::endl;
timing_ms 调用了 timing_median_ms,再调用func 得到float返回值。 这个func实际上就是lambda表达式了。表达式用到 [&],说明它能够以引用形式使用其他的外部变量,因为里面的一些参数,如graph,是一个外部变量 。// Execute 'func', and return the duration of the function call, in ms. template <typename Func> inline float timing_ms(Func func) { return timing_median_ms(1, func); }