teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

append

2016/11/05 13:09

投稿

yohhoy
yohhoy

スコア6191

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

3

append

2016/11/05 13:09

投稿

yohhoy
yohhoy

スコア6191

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

2

append code

2016/11/05 12:48

投稿

yohhoy
yohhoy

スコア6191

answer CHANGED
@@ -1,3 +1,32 @@
1
1
  ラムダ式の自己再帰呼出しには、[Recursive lambda functions in C++14](http://stackoverflow.com/questions/18085331/recursive-lambda-functions-in-c14) 回答のように不動点コンビネータを介する方法があります。
2
2
 
3
+ ```C++
4
+ template<typename Functor>
5
+ struct fix_type {
6
+ Functor functor;
7
+
8
+ template<typename... Args>
9
+ decltype(auto) operator()(Args&&... args) const&
10
+ { return functor(functor, std::forward<Args>(args)...); }
11
+ };
12
+
13
+ template<typename Functor>
14
+ fix_type<typename std::decay<Functor>::type> fix(Functor&& functor)
15
+ { return { std::forward<Functor>(functor) }; }
16
+
17
+ int collatz_count5(int x)
18
+ {
19
+ auto f = fix([](auto&& f, int n) {
20
+ if (n == 1) {
21
+ return 0;
22
+ } else if (n % 2 == 0) {
23
+ return f(f, n / 2) + 1;
24
+ } else {
25
+ return f(f, 3 * n + 1) + 1;
26
+ }
27
+ });
28
+ return f(x);
29
+ }
30
+ ```
31
+
3
32
  (個人的にはラムダ式の"名前"が欲しいなら普通の関数でいいじゃない派なので、ネタとロマンの追求以外ではこのようなコーディングには賛同しませんが)

1

fix typo

2016/11/05 12:11

投稿

yohhoy
yohhoy

スコア6191

answer CHANGED
@@ -1,3 +1,3 @@
1
1
  ラムダ式の自己再帰呼出しには、[Recursive lambda functions in C++14](http://stackoverflow.com/questions/18085331/recursive-lambda-functions-in-c14) 回答のように不動点コンビネータを介する方法があります。
2
2
 
3
- 個人的にはラムダ式の"名前"が欲しいなら普通の関数でいいじゃない派なので、ネタとロマンの追求以外ではこのようなコーディングには賛同しませんが)
3
+ 個人的にはラムダ式の"名前"が欲しいなら普通の関数でいいじゃない派なので、ネタとロマンの追求以外ではこのようなコーディングには賛同しませんが)