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

質問編集履歴

2

解決

2018/11/12 07:54

投稿

opyon
opyon

スコア1009

title CHANGED
File without changes
body CHANGED
@@ -1,3 +1,67 @@
1
+ ###解決!
2
+ 回答くださった方ありがとうございました。
3
+ どの回答もとても参考になりました。
4
+ 具体的なコードもあったので分かりやすかったです。
5
+
6
+ 実際頻繁に使うのか?と言われると可読性や冗長になることもあるのでなんとも言えませんが、
7
+ マクロで出来ないことが実現しやすいし出来ることの可能性はかなり広がったと思います。
8
+
9
+ ###サンプルコード(早速使ってみた)
10
+ ```C++
11
+ #include <bits/stdc++.h>
12
+
13
+ bool is_odd(int x)
14
+ {
15
+ return x % 2;
16
+ }
17
+
18
+ unsigned fibo(unsigned n)
19
+ {
20
+ if (n < 2)
21
+ {
22
+ return 1;
23
+ }
24
+ return fibo(n - 1) + fibo(n - 2);
25
+ }
26
+
27
+ template <typename T1, typename T2, typename Func1, typename Func2, typename T3>
28
+ void yn(const T1 &e1, const T2 &e2, const Func1 func1, const Func2 func2, const T3 &fe1)
29
+ {
30
+ auto ret1 = func2(fe1);
31
+ auto ret2 = (func1(ret1) ? e1 : e2);
32
+ std::cout << "ret1:" << ret1 << " ret2:" << ret2 << "\n";
33
+ }
34
+
35
+ // 上記では出力するために分けていますが入れ子でも使えますし
36
+ // 可変長でも使えそうです
37
+ // ret = (func1(func2(fe1)) ? e1 : e2);
38
+
39
+ int main()
40
+ {
41
+ // フィボナッチ数列のi項の奇数偶数判定
42
+ for (unsigned i = 0; i < 20; i++)
43
+ {
44
+ std::cout << "i:" << i << " ";
45
+ yn("odd", "even", is_odd, fibo, i);
46
+ }
47
+ getchar();
48
+ return 0;
49
+ }
50
+
51
+ // 出力サンプル
52
+ // i:0 ret1:1 ret2:odd
53
+ // i:1 ret1:1 ret2:odd
54
+ // i:2 ret1:2 ret2:even
55
+ // i:3 ret1:3 ret2:odd
56
+ // i:4 ret1:5 ret2:odd
57
+ // i:5 ret1:8 ret2:even
58
+ // i:6 ret1:13 ret2:odd
59
+ // i:7 ret1:21 ret2:odd
60
+ // i:8 ret1:34 ret2:even
61
+ // i:9 ret1:55 ret2:odd
62
+
63
+ ```
64
+
1
65
  ###追記
2
66
  [lambda式を引数として受け取る関数の自作はできますか?](https://teratail.com/questions/37610)
3
67
  こちらの回答が参考になりそうです。

1

追記 参考URL

2018/11/12 07:54

投稿

opyon
opyon

スコア1009

title CHANGED
File without changes
body CHANGED
@@ -1,3 +1,9 @@
1
+ ###追記
2
+ [lambda式を引数として受け取る関数の自作はできますか?](https://teratail.com/questions/37610)
3
+ こちらの回答が参考になりそうです。
4
+ また時間のある時に作ってみます。
5
+
6
+
1
7
  ###知りたいこと
2
8
  関数の引数に関数を渡せますか?
3
9