-
Notifications
You must be signed in to change notification settings - Fork 0
/
5-lambda.h
146 lines (109 loc) · 3.19 KB
/
5-lambda.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include "ofMain.h"
class ofApp : public ofBaseApp
{
public:
void setup() {
// 例文
[](){}();
// [lambda capture]
// 外部変数を扱う場合、関数実体に渡す変数をコピーにするか参照にするか等をここで明示できる
[]
// (parameter declaration clause)
// 関数の引数定義
()
// {compound statement}
// 関数の本体
{}
// () <-- function call expression
// 関数の呼び出し
()
;
{
auto our_function = [](int a, int b)
// -> unsigned int
{
cout << __PRETTY_FUNCTION__ << endl; // auto ofApp::setup()::(anonymous class)::operator()() const
// 返り値の型は、decltype(a + b)。
// unsigned int あたりのコメントを外すと型指定ができる
return a + b;
};
cout << our_function(10, 20) << endl;
}
{
const int size = 30;
const int max = 50;
auto our_comparison = [](const int &lhs, const int &rhs) { return lhs < rhs; };
auto our_generator = [](){ return std::floor(ofRandom(k_max)); };
std::vector<int> array(k_size);
std::generate(std::begin(array), std::end(array), our_generator);
std::sort(std::begin(array), std::end(array), our_comparison);
for (const auto &v: array) {
cout << v << endl;
}
}
{
/*
http://ja.wikipedia.org/wiki/C%2B%2B11
[] //ラムダ関数外のどの変数も使うことができない。
[x, &y] //xはコピーされる。yは参照渡しされる。
[&] //すべての外部変数は、もし使われれば暗黙的に参照渡しされる。
[=] //すべての外部変数は、もし使われれば暗黙的にコピーされる。
[&, x] //xは明示的にコピーされる。その他の変数は参照渡しされる。
[=, &z] //zは明示的に参照渡しされる。その他の変数はコピーされる。
*/
auto dump = [](int a, int b) { cout << "a:" << a << ", b:" << b << endl; };
{
cout << "---" << endl;
int v1 = 10, v2 = 20;
dump(v1, v2); // 10, 20
// すべての外部変数をコピーとして扱う
// コピーした値を変更したい場合は mutable修飾
[=]() mutable {
v1 += 10;
v2 += 10;
}();
dump(v1, v2); // 10, 20
}
{
cout << "---" << endl;
int v1 = 10, v2 = 20;
dump(v1, v2); // 10, 20
// すべての外部変数を参照として扱う
[&]() {
v1 += 10;
v2 += 10;
}();
dump(v1, v2); // 20, 30
}
{
cout << "---" << endl;
int v1 = 10, v2 = 20;
dump(v1, v2); // 10, 20
// v1だけコピー、その他は参照
[&, v1]() mutable {
v1 += 10;
v2 += 10;
}();
dump(v1, v2); // 10, 30
}
}
{
cout << "---" << endl;
// ↓これは通らない。
// 関数中から ofApp::hi() は見えない
// [](){ hi(); }();
// scopeとして this を渡すと通る
[this](){ hi(); }();
}
ofExit(); // 今回はサンプル描画ナシ
}
void hi() {
cout << "hi." << endl;
}
};
#pragma mark -
#pragma mark main
int main(){
ofSetupOpenGL(500, 500, OF_WINDOW);
ofRunApp(new ofApp());
}