###解決!
回答くださった方ありがとうございました。
どの回答もとても参考になりました。
具体的なコードもあったので分かりやすかったです。
実際頻繁に使うのか?と言われると可読性や冗長になることもあるのでなんとも言えませんが、
マクロで出来ないことが実現しやすいし出来ることの可能性はかなり広がったと思います。
###サンプルコード(早速使ってみた)
C++
1#include <bits/stdc++.h> 2 3bool is_odd(int x) 4{ 5 return x % 2; 6} 7 8unsigned fibo(unsigned n) 9{ 10 if (n < 2) 11 { 12 return 1; 13 } 14 return fibo(n - 1) + fibo(n - 2); 15} 16 17template <typename T1, typename T2, typename Func1, typename Func2, typename T3> 18void yn(const T1 &e1, const T2 &e2, const Func1 func1, const Func2 func2, const T3 &fe1) 19{ 20 auto ret1 = func2(fe1); 21 auto ret2 = (func1(ret1) ? e1 : e2); 22 std::cout << "ret1:" << ret1 << " ret2:" << ret2 << "\n"; 23} 24 25// 上記では出力するために分けていますが入れ子でも使えますし 26// 可変長でも使えそうです 27// ret = (func1(func2(fe1)) ? e1 : e2); 28 29int main() 30{ 31 // フィボナッチ数列のi項の奇数偶数判定 32 for (unsigned i = 0; i < 20; i++) 33 { 34 std::cout << "i:" << i << " "; 35 yn("odd", "even", is_odd, fibo, i); 36 } 37 getchar(); 38 return 0; 39} 40 41// 出力サンプル 42// i:0 ret1:1 ret2:odd 43// i:1 ret1:1 ret2:odd 44// i:2 ret1:2 ret2:even 45// i:3 ret1:3 ret2:odd 46// i:4 ret1:5 ret2:odd 47// i:5 ret1:8 ret2:even 48// i:6 ret1:13 ret2:odd 49// i:7 ret1:21 ret2:odd 50// i:8 ret1:34 ret2:even 51// i:9 ret1:55 ret2:odd 52
###追記
lambda式を引数として受け取る関数の自作はできますか?
こちらの回答が参考になりそうです。
また時間のある時に作ってみます。
###知りたいこと
関数の引数に関数を渡せますか?
###現状
前の質問の@LouiS0616さんの回答 で頂いたコードをヒントにこんなこと出来ると便利そうだなと思い質問させていただいています。
例えばこの func1(e1) を引数も指定して渡せたら汎用的に使えて便利そうです。
分かりにくいかも知れませんが例えば func1()とfunc2() を指定して切り替えられますか?
yn(func1(3), "yes", "no");
yn(func2(2), "yes", "no");
例えが悪いのでこれだと結果が渡されて期待通りの結果が出ますがイメージが伝わればと思います。
どのようにしたら出来るのか検討もつかないので出来るか出来ないかだけでもご教示頂けると幸いです。
C++
1#include <bits/stdc++.h> 2 3bool func1(int x) 4{ 5 return x % 2; 6} 7 8bool func2(int x) 9{ 10 return (x + 1) % 2; 11} 12 13template <typename T1, typename T2, typename T3> 14void yn(const T1 &e1, const T2 &e2, const T3 &e3) 15{ 16 auto ret = (func1(e1) ? e2 : e3); 17 std::cout << ret << "\n"; 18} 19 20int main() 21{ 22 yn(3, "yes", "no"); 23 getchar(); 24 return 0; 25} 26
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/12 07:59