回答編集履歴

4

append

2016/11/05 13:09

投稿

yohhoy
yohhoy

score2

test CHANGED
@@ -1,4 +1,8 @@
1
1
  ラムダ式の自己再帰呼出しには、[Recursive lambda functions in C++14](http://stackoverflow.com/questions/18085331/recursive-lambda-functions-in-c14) 回答のように不動点コンビネータを介する方法があります。
2
+
3
+
4
+
5
+ → 追記:書いた後に気づいたのですが本質的には`collatz_count2`と等価ですね。
2
6
 
3
7
 
4
8
 

3

append

2016/11/05 12:48

投稿

yohhoy
yohhoy

score2

test CHANGED
@@ -2,4 +2,62 @@
2
2
 
3
3
 
4
4
 
5
+ ```C++
6
+
7
+ template<typename Functor>
8
+
9
+ struct fix_type {
10
+
11
+ Functor functor;
12
+
13
+
14
+
15
+ template<typename... Args>
16
+
17
+ decltype(auto) operator()(Args&&... args) const&
18
+
19
+ { return functor(functor, std::forward<Args>(args)...); }
20
+
21
+ };
22
+
23
+
24
+
25
+ template<typename Functor>
26
+
27
+ fix_type<typename std::decay<Functor>::type> fix(Functor&& functor)
28
+
29
+ { return { std::forward<Functor>(functor) }; }
30
+
31
+
32
+
33
+ int collatz_count5(int x)
34
+
35
+ {
36
+
37
+ auto f = fix([](auto&& f, int n) {
38
+
39
+ if (n == 1) {
40
+
41
+ return 0;
42
+
43
+ } else if (n % 2 == 0) {
44
+
45
+ return f(f, n / 2) + 1;
46
+
47
+ } else {
48
+
49
+ return f(f, 3 * n + 1) + 1;
50
+
51
+ }
52
+
53
+ });
54
+
55
+ return f(x);
56
+
57
+ }
58
+
59
+ ```
60
+
61
+
62
+
5
63
  (個人的にはラムダ式の"名前"が欲しいなら普通の関数でいいじゃない派なので、ネタとロマンの追求以外ではこのようなコーディングには賛同しませんが)

2

append code

2016/11/05 12:11

投稿

yohhoy
yohhoy

score2

test CHANGED
@@ -2,4 +2,4 @@
2
2
 
3
3
 
4
4
 
5
- 個人的にはラムダ式の"名前"が欲しいなら普通の関数でいいじゃない派なので、ネタとロマンの追求以外ではこのようなコーディングには賛同しませんが)
5
+ 個人的にはラムダ式の"名前"が欲しいなら普通の関数でいいじゃない派なので、ネタとロマンの追求以外ではこのようなコーディングには賛同しませんが)

1

fix typo

2016/11/05 12:07

投稿

yohhoy
yohhoy

score2

test CHANGED
@@ -2,74 +2,4 @@
2
2
 
3
3
 
4
4
 
5
- → 追記:書いた後に気づいたのですが本質的には`collatz_count2`と等価ですね。
6
-
7
-
8
-
9
- ```C++
10
-
11
- template<typename Functor>
12
-
13
- struct fix_type {
14
-
15
- Functor functor;
16
-
17
-
18
-
19
- template<typename... Args>
20
-
21
- decltype(auto) operator()(Args&&... args) const&
22
-
23
- { return functor(functor, std::forward<Args>(args)...); }
24
-
25
- };
26
-
27
-
28
-
29
- template<typename Functor>
30
-
31
- fix_type<typename std::decay<Functor>::type> fix(Functor&& functor)
32
-
33
- { return { std::forward<Functor>(functor) }; }
34
-
35
-
36
-
37
- int collatz_count5(int x)
38
-
39
- {
40
-
41
- auto f = fix([](auto&& f, int n) {
42
-
43
- if (n == 1) {
44
-
45
- return 0;
46
-
47
- } else if (n % 2 == 0) {
48
-
49
- return f(f, n / 2) + 1;
50
-
51
- } else {
52
-
53
- return f(f, 3 * n + 1) + 1;
54
-
55
- }
56
-
57
- });
58
-
59
- return f(x);
60
-
61
- }
62
-
63
- ```
64
-
65
-
66
-
67
- 個人的にはラムダ式の"名前"が欲しいなら普通の関数でいいじゃない派なので、ネタとロマンの追求以外ではこのようなコーディングには賛同しませんが)
5
+ 個人的にはラムダ式の"名前"が欲しいなら普通の関数でいいじゃない派なので、ネタとロマンの追求以外ではこのようなコーディングには賛同しませんが)
68
-
69
-
70
-
71
- > C++17からはこうなるみたいな情報もあれば嬉しいです。
72
-
73
-
74
-
75
- C++1z(17)でのラムダ式まわりの言語拡張は `*this`コピーキャプチャ と `constexpr`ラムダ ですから、本件に関しては実装の選択肢が増えたりしないと思います。私見ですが、autoによる静的型推論とC++の静的型システムの上で実現する以上、`collatz_count2`/`collatz_count5`以外の実装手段は将来的にもでてこないのではと思います。