Lambda的语法
所谓的Lambda
是一份功能定义式,可被定义于语句或表达式内部。因此你可以拿Lambda
当做inline
函数使用。
最小型的Lambda
函数没有参数,什么也不做,如下例子:
[]{std::cout << "hello Lambda" << std::endl;}
可以直接调用它:
[]{std::cout << "hello Lambda" << std::endl;}();
或者把它传递给对象,使之能被调用:
auto l = []{std::cout << "hello Lambda" << std::endl;};
l();
如你所见,lambda总是由一个所谓lambda introducer
引入;那是一组方括号,你可以在其内指明一个所谓的capture
,用来在lambda内部访问非静态外部对象,如果无序访问外部数据,方括号可以为空。
Lambda
可以拥有参数,指明于小括号内,就像任何函数一样:
auto l = [](const std::string & s){std::cout << s << std::endl;};
l("hello lambda");
lambda也可以返回某物,但你不需要指明返回类型,返回类型会根据返回值被推导出来,如:
[]{return 42;}
如果一定想指明一个返回类型,可以使用新式C++语法,如:
[]()->double{return 42;}
这样一来就必须指明返回类型
Capture(用以访问外部作用域)
Lambda的类型
Lambda vs Binder
int main()
{
auto plus10 = [](int i) {return i + 10; };
cout << "+10: " << plus10(7) << endl;
auto plus10times2 = [](int i) {return (i + 10) * 2; };
cout << "+10 *2: " << plus10times2(7) << endl;
auto pow3 = [](int i) {return i * i*i; };
cout << "x*x*x: " << pow3(7) << endl;
auto inversDivide = [](double d1, double d2) {return d2 / d1; };
cout << "invdiv: " << inversDivide(49, 7) << endl;
}
Lambda调用全局函数和成员函数
char myToupper(char c)
{
locale loc;
return use_facet<ctype<char>>(loc).toupper(c);
}
int main()
{
string s("Internationalization");
string sub("Nation");
string::iterator pos;
pos = search(s.begin(), s.end(), sub.begin(), sub.end(), [](char c1, char c2) {return myToupper(c1) == myToupper(c2); });
if (pos != s.end())
{
cout << "\"" << sub << "\" is part of \"" << s << "\"" << endl;
}
}
class Person
{
private:
string name;
public:
Person(const string& n) :name(n) {}
void print()const
{
cout << name << endl;
}
void print2(const string& prefix)const
{
cout << prefix << name << endl;
}
};
int main()
{
vector<Person>coll{ Person("Tick"), Person("Trick"),Person{"Track"} };
for_each(coll.begin(), coll.end(), [](const Person & p) {p.print(); });
cout << endl;
for_each(coll.begin(), coll.end(), [](const Person & p) {p.print2("Person: "); });
cout << endl;
bind(&Person::print2, _1, "This is: ")(Person("nico"));
}