回答編集履歴

4

append

2016/11/05 13:09

投稿

yohhoy
yohhoy

スコア6189

test CHANGED
@@ -65,3 +65,11 @@
65
65
 
66
66
 
67
67
  (個人的にはラムダ式の"名前"が欲しいなら普通の関数でいいじゃない派なので、ネタとロマンの追求以外ではこのようなコーディングには賛同しませんが)
68
+
69
+
70
+
71
+ > C++17からはこうなるみたいな情報もあれば嬉しいです。
72
+
73
+
74
+
75
+ C++1z(17)でのラムダ式まわりの言語拡張は `*this`コピーキャプチャ と `constexpr`ラムダ ですから、本件に関しては実装の選択肢が増えたりしないと思います。私見ですが、autoによる静的型推論とC++の静的型システムの上で実現する以上、`collatz_count2`/`collatz_count5`以外の実装手段は将来的にもでてこないのではと思います。

3

append

2016/11/05 13:09

投稿

yohhoy
yohhoy

スコア6189

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
 

2

append code

2016/11/05 12:48

投稿

yohhoy
yohhoy

スコア6189

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
  (個人的にはラムダ式の"名前"が欲しいなら普通の関数でいいじゃない派なので、ネタとロマンの追求以外ではこのようなコーディングには賛同しませんが)

1

fix typo

2016/11/05 12:11

投稿

yohhoy
yohhoy

スコア6189

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