関数を配列でまとめて、それをindexで呼び出すみたいなことをしたいのですが、
関数を配列にまとめるにはどうしたらよいでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答5件
0
こんにちは。
こんなですかね。
ただ、引数やリターン値を統一するか、何かでラップするか(xxxArgsみたいな)が必要ですね。
C#
1static void Main(string[] args) 2{ 3 List<Func<int, int, int>> hoge = new List<Func<int, int, int>>(); 4 hoge.Add((a, b) => 5 { 6 return a + b; 7 }); 8 hoge.Add((a, b) => 9 { 10 return a - b; 11 }); 12 hoge.Add((a, b) => 13 { 14 return a * b; 15 }); 16 17 var piyo = hoge[2](2, 4); 18 Console.WriteLine(piyo); 19 Console.Read(); 20}
投稿2015/12/21 03:36
総合スコア4791
0
例えばこんな感じででどうでしょう?
bool result = JumpTest.Execute(1, 2, 3);
みたいな感じでの使い方を想定してみました。
c#
1public class JumpTest { 2 private delegate bool funcDelegate(int arg1, int arg2); 3 private static funcDelegate[] funcTables = { 4 test000, 5 test001, 6 test002, 7 }; 8 private static bool test000(int arg1, int arg2) { 9 return true; 10 } 11 private static bool test001(int arg1, int arg2) { 12 return true; 13 } 14 private static bool test002(int arg1, int arg2) { 15 return true; 16 } 17 public static bool Execute(int index, int arg1, int arg2) { 18 if (((index >= 0) && (index < funcTables.Length)) { 19 funcDelegate func = funcTables[index]; 20 if(func != null) { 21 return func(arg1, arg2); 22 } 23 } 24 return false; 25 } 26} 27
投稿2016/07/19 08:44
総合スコア2160
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
C言語の関数ポインタ配列,C#のdelegateを使えば達成できますが,いずれも引数の型が揃っている必要があります.
c
1#include <stdio.h> 2int fn1(int arg1, int arg2) 3{ 4 return arg1 + arg2; 5} 6int fn2(int arg1, int arg2) 7{ 8 return arg1 * arg2; 9} 10int main(int argc, char *argv[]) 11{ 12 int (*test[2])(int, int); 13 int i; 14 test[0] = fn1; 15 test[1] = fn2; 16 for (i = 0; i < 2; i++) { 17 printf("fn%d(%d,%d) = %d\n", i+1, 3, 4, test[i](3, 4)); 18 } 19 return 0; 20}
delegateはdelegateで宣言したインスタンスにメソッドを追加し,メソッドを実行すると全ての登録されたメソッドに同じ引数で呼び出します.
引数の型や個数が異なる場合は,64ビット環境であれば全て64ビットのunsigned long型で引数の最大個数分用意しておいて,ポインタのキャストによってごまかす方法があります.
こういったことがやりやすいのは,Cの良さだと思います.
c
1#include <stdio.h> 2struct xy { 3 int x; 4 int y; 5}; 6int fn1(unsigned long arg1, unsigned long unused) 7{ 8 struct xy *p = (struct xy *)arg1; 9 return p->x + p->y; 10} 11int fn2(unsigned long arg1, unsigned long arg2) 12{ 13 return *(int*)arg1 * *(int*)arg2; 14} 15int main(int argc, char *argv[]) 16{ 17 int i; 18 struct fn_arg { 19 int (*fn)(unsigned long, unsigned long); 20 unsigned long arg1; 21 unsigned long arg2; 22 } test[2]; 23 struct xy tmp; 24 tmp.x = 3; 25 tmp.y = 4; 26 27 test[0].fn = fn1; 28 test[0].arg1 = (unsigned long)&tmp; 29 test[0].arg2 = 0; 30 31 test[1].fn = fn2; 32 test[1].arg1 = (unsigned long)&tmp.x; 33 test[1].arg2 = (unsigned long)&tmp.y; 34 35 for (i = 0; i < 2; i++) { 36 printf("fn%d = %d\n", i+1, test[i].fn(test[i].arg1, test[i].arg2)); 37 } 38 return 0; 39}
慣れているのがCなので,こちらで書いてしまいました.
C#への変更はご自分でお願いします.
投稿2015/12/21 04:21
編集2015/12/21 04:22総合スコア751
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。