C + + supplements--LAMBDA expression principle
Preface
Lambda expressions are presented in the new C++11 standard. In lambda expressions, we focus on the use of it. Now let's talk about how it's implemented.
Body1. Function Objects
The object of the class is combined with parentheses to show the general behavior of the function, which can be called a function object.
#include <iostream>using namespace Std;class myclass{public://overloaded function call operator () int operator () (int i) {return i;}}; The invocation of int main () {MyClass my;//my () behaves like the same function int i = my (1); The essence is to call My.operator () (1) cout << "i =" << i << endl;cin.get (); return 0;}
Run
This example shows that the essence of a function object is to overload the function call operator. When a class overloads the function call operator (), its object becomes a function object. This is the basis for understanding the internal implementation of a lambda expression.
2.lambda Expression Principle
Principle: The compiler generates an anonymous object for an anonymous class with a lambda expression and overloads the function call operator in the class.
We start with the simplest lambda expression, from easy to difficult
2.1 No capture list and parameter list
Auto print = []{cout << "Zhangxiang" << Endl;};
The compiler will translate this sentence into the following scenario:
Generates the corresponding class with the given lambda expression print_class{public:void operator () (void) const{cout << "Zhangxiang" << endl;}};/ /Create an object with a constructed class, and print is now a function object auto print = Print_class ();
the class name naming rules for a generated class can be variable, not necessarily.
2.2 No capture list but with parameter list
Auto add = [] (int a, int b) {return a + B;};
The compiler will translate this sentence into the following scenario:
Class Add_class{public:auto operator () (int a, int b) Const{return A + b;}}; Auto add = Add_class ();
2.3 have capture list, parameter list optional
There are two kinds of capture methods: Reference capture, value capture, and so on, it can be subdivided in different cases.
2.3.1 Value Capture
int year = 19900212;char *name = "Zhangxiang";//Use value capture to capture all defined local variables, such as year,nameauto print = [=] () {cout << year <&L T Ends << name << Endl;};
translation
int year = 19900212;char *name = "Zhangxiang"; class print_class{public://determines the argument list form of the constructor based on the capture list print_class (int year, Char *name): Year, name (name) {}void operator () (void) Const{cout << year << ends << name << Endl;} Private:int Year;char *name;}; Auto print = Print_class (A, str);
the effect is the same, it is not demonstrated.
2.3.2 Reference Capture
int year = 19900212;char *name = "Zhangxiang", auto print = [&] () {year++;cout << year << ends << name << Endl;};
translation
int year = 19900212;char *name = "Zhangxiang"; class print_class{public://because it is a reference capture, the argument list takes the form of a reference print_class (int &year, Char *&name): Year (year), name (name) {}void operator () (void) const{year++; Compiler passed, const is invalid for reference type cout << year << ends << name << Endl;} Private:int &year;char *&name;};
after testing, the effect is the same.
2.3.3 Hybrid Capture
int year = 19900212;int shoes = 42;char *name = "Zhangxiang"; auto show = [&, shoes] () mutable{shoes++;year++;cout <& Lt Year << ends << shoes << ends << name << Endl;};
translation
int year = 19900212;int shoes = 42;char *name = "Zhangxiang"; class show_class{private:int &year;mutable int Shoes;char *&name;public:show_class (int &year, int shoes, char *&name): Year, Shoes (shoes), name (name) {}void Operator () (void) Const{shoes++;year++;cout << year << ends << shoes << ends << name << Endl;}}; Auto Show = Show_class (year, shoes, name); show ();
By default, variables that are captured by value cannot be modified unless you add the keyword mutable after the argument list. The above code shows how mutable in the corresponding class is added.
Summary
These sample code basically shows the implementation principles of lambda expressions in various situations, and it's easy to think it over.
Directory of this column
- C + + Supplements directory
Directory of all content
C + + supplements--LAMBDA expression principle