//
// Created by light on 19-11-3.
//
#include
#include
#include
#include
#include
using namespace std;
// [introducer](optional)mutable throwSpec->retType {}
// mutableå³å®[]è½å¤è¢«æ¹å mutable throwSpec retType齿¯éæ©ç,åªè¦æä¸ä¸ªåå¨å°±å¾å()
// retType è¿åç±»å
// ()æ¾åæ°
// []æ¾å¤é¢åé passed by value or reference
class UnNamedLocalFunction {
private:
int localVar;
public:
UnNamedLocalFunction(int var) : localVar(var) {}
bool operator()(int val) {
return val == localVar;
}
};
class Person {
public:
string firstname;
string lastname;
};
class LambdaFunctor {
public:
LambdaFunctor(int a, int b) : m_a(a), m_b(b) {}
bool operator()(int n) const {
return m_a < n && n < m_b;
}
private:
int m_a;
int m_b;
};
class X {
private:
int __x, __y;
public:
X(int x, int y) : __x(x), __y(y) {}
int operator()(int a) { return a; }
int f() {
// ä¸å lambda çè¯å¢æ¯æå彿° X::f
// 对äº[=]æ[&]çå½¢å¼ï¼lambda 表达å¼å¯ä»¥ç´æ¥ä½¿ç¨ this æé
return [&]() -> int {
return operator()(this->__x + __y); // X::operator()(this->x + (*this).y)
// æ¥æç±»å X*
}();
}
int ff() {
return [this]() {
return this->__x;
}();
}
};
int main() {
[] {
cout << "hello" << endl;
}();
auto I = [] {
cout << "hello" << endl;
};
I();
int id = 0;
// å
çåé¢çid å¦ææ²¡æmutable error: increment of read-only variable âidâ
auto f = [id]()mutable {
cout << "id=" << id << endl;
++id;
};
id = 42;
f(); // 0
f(); // 1
f(); // 2
cout << id << endl;
// ä¸è¿°lambdaå°±ç¸å½äº
// class Functor {
// private:
// int id;
// public:
// void operator() {
// cout << "id=" << id << endl;
// ++id;
// }
// };
// Functor f;
int id1 = 0;
// å ä¸å mutable没影å,ä¸ä¼ å¼ç¨åªè¦åé¢id1被修æ¹äº,å°±ä¼ä½¿ç¨ä¿®æ¹åçå¼è¿è¡æä½
auto f1 = [&id1]() {
cout << "id1=" << id1 << endl;
++id1;
};
id1 = 42;
f1(); // 42
f1(); // 43
f1(); // 44
cout << id1 << endl;
// ä¼ åä¸è¿å
int id2 = 0;
auto f2 = [&id2](int ¶m) {
cout << "id2=" << id2 << endl;
++id2;
++param;
cout << "param=" << param << endl;
static int x = 5;
return id2;
};
int param = 1;
f2(param);
cout << "param=" << param << endl;
// [=] =表示é»è®¤ä»¥by valueä¼ éå¤é¨ææåé
// [&] &表示é»è®¤ä»¥by referenceä¼ éå¤é¨ææåé
auto f3 = [&]() {
cout << "id=" << id << endl;
cout << "id1=" << id1 << endl;
cout << "id2=" << id2 << endl;
cout << "param=" << param << endl;
};
f3();
// ä¸é¨åä¼ å¼ç¨,å
¶ä½ä¼ å¼
cout << "id=" << id << endl;
auto f4 = [=, &id]() { // =ä¸å¯ä»¥æ¾å¨&idåé¢
cout << "id=" << id << endl;
id++;
cout << "id1=" << id1 << endl;
cout << "id2=" << id2 << endl;
cout << "param=" << param << endl;
};
f4();
// ä¸é¨åä¼ å¼,å
¶ä½ä¼ å¼ç¨
cout << "id=" << id << endl;
auto f5 = [&, id]() { // &ä¸å¯ä»¥æ¾å¨idåé¢
cout << "id=" << id << endl;
cout << "id1=" << id1 << endl;
cout << "id2=" << id2 << endl;
cout << "param=" << param << endl;
};
f5();
// this æé
X x_(1, 2);
cout << "x_.f()=" << x_.f() << endl; // 1+2=3
cout << "x_.ff()=" << x_.ff() << endl; // 1
// ä¸é¢lambda彿°çä»·äºä¸è¿°çUnNamedLocalFunction
int tobefound = 5;
auto lambda1 = [tobefound](int val) {
return val == tobefound;
};
bool b1 = lambda1(5);
UnNamedLocalFunction lambda2(tobefound);
bool b2 = lambda2(5);
cout << b1 << " " << b2 << endl;
auto ll1 = [](int x) -> int {
return x + 10;
};
// lambda å¿å彿°
function ll = [](int x) -> float {
return x + 10.0;
};
cout< cmp = [](const Person &p1, const Person &p2) {
return p1.lastname < p2.lastname;
};
// 对äºlambda,æä»¬å¾å¾åªæobject,å¾å°æäººè½å¤ååºå®çç±»åï¼èææ¶å°±éè¦ç¥éå®çç±»å,è¦è·å¾å
¶type,å°±è¦åå©å
¶decltype
set col(cmp);
// è¦ç³ælambda对象çç±»åï¼å¯ä»¥ä½¿ç¨templateæè
autoè¿è¡èªå¨æ¨å¯¼ã
// 妿éè¦ç¥éç±»åï¼å¯ä»¥ä½¿ç¨decltypeï¼æ¯å¦ï¼è®©lambda彿°ä½ä¸ºå
³è容卿è
æ åºå®¹å¨çæåºå½æ°æè
åå¸å½æ°ã
// ä¸é¢ä»£ç ç»åºäºäºä¾ï¼decltypeç第ä¸ç§ç¨æ³ä¸çäºä¾ï¼ï¼å®ä¹äºä¸ä¸ªlambda彿°ç¨cmp表示ï¼ç¨æ¥æ¯è¾Person对象ç大å°ï¼ä¼ å
¥å°Set容å¨ä¸å»ï¼
// 使 ¹æ®å³è¾¹çset容å¨çå®ä¹ï¼æä»¬ä¼ å
¥çä¸ä»
æ¯cmpï¼æé 彿°ï¼ï¼è¿è¦ä¼ å
¥æ¨¡æ¿çcmpç±»åï¼Setå
é¨éè¦å£°æcmpç±»åï¼ï¼
// æä»¥å¿
须使ç¨decltypeæ¥æ¨å¯¼åºç±»åã
// ï¼å¦ææ²¡æåæé 彿°ä¼ å
¥cmpï¼è°ç¨çæ¯é»è®¤çæé 彿°ï¼ä¹å°±æ¯set() : t(Compare()), è¿é伿¥é, ç°å¨ä¸ä¼åºé®é¢äº!
// å 为Compare()æçæ¯è°ç¨é»è®¤çlambdaæé 彿°ï¼èlambda彿°æ²¡æé»è®¤æé 彿°åèµå¼å½æ°ï¼
vector vec{5, 28, 50, 83, 70, 590, 245, 59, 24};
int x = 30, y = 100;
// 彿°å¯¹è±¡æ¯å¾å¼ºå¤§çï¼å°è£
代ç åæ°æ®æ¥èªå®ä¹æ ååºçè¡ä¸ºï¼ä½éè¦ååºå½æ°å¯¹è±¡éè¦ååºæ´ä¸ªclassï¼è¿æ¯ä¸æ¹ä¾¿çï¼è䏿¯éæ¬å°çï¼
// ç¨èµ·æ¥ä¹éº»ç¦ï¼éè¦å»çææ ·ä½¿ç¨ï¼å¦å¤ç¼è¯åºéçä¿¡æ¯ä¹ä¸å好ï¼èä¸å®ä»¬ä¸æ¯inlineçï¼æçä¼ä½ä¸äºï¼ç®æ³æçè¿æ¯æéè¦çï¼ã
// vec.erase(remove_if(vec.begin(), vec.end(), LambdaFunctor(x, y)), vec.end());
// for(auto i:vec) cout<