アットウィキロゴ

関数ポインタ

11 :デフォルトの名無しさん:2010/04/13(火) 02:18:03
別に僕は今のC言語で問題ないんだけど
新しいのを作るとしたらポインタ、特に関数へのポインタを引数に取り、関数へのポインタを引数に取る関数へのポインタを返す関数へのポインタとかを美しく記述できる文法を切口にポインタに変わるアドレッシング方法を考えればいいとおもう
int<- p;
int ()(void)<- fp;
int ()(int ()(void)<-)<- ()(int<- ()(void)<-)<- fpp;
ダメだ、読みにくい
int (*(*fpp)(int (*)(void)))(int (*)(void));

そもそも関数ポインタに代わるなにか、高階関数とかあればよいのだろうか

12 :デフォルトの名無しさん:2010/04/13(火) 02:25:49
11
普通に関数ポインタをtypedefすれば良いんじゃない?

13 :デフォルトの名無しさん:2010/04/13(火) 02:26:51
11
そのための typedef。

14 :12:2010/04/13(火) 02:27:09
まぁ、関数ポインタを見やすくすること自体は良いと思うけど…

15 :デフォルトの名無しさん:2010/04/13(火) 02:44:25
ちょっとした思い付きなんだけどスコープ内にある関数なら、
第一引数と一致する型の変数から暗黙的に関数を呼べると以外と便利かも…
※javascriptのthisポイントみたいな感じで

char *copy( char *src, *dst );
char *trim( char *src );
char *toupper( char *src );

p->copy(*dst)->trim()->toupper();



16 :15:2010/04/13(火) 02:45:59
アホだ俺、もう寝よう…orz

p->copy(*dst)->trim()->toupper(); ×

p->copy(dst)->trim()->toupper(); ○


関数ポインタならDのfunctionやScalaの関数宣言が参考になると

int function(int) fp; // fp は関数へのポインタ
int delegate(int) dg; // dg は関数へのデリゲート

val f:(a:Int,b:Int)=>Int = {(a:Int,b:Int)=>a+b} がデリゲード
val f:(a:Int,b:Int)->Int が関数ポインタとか

15
C#の拡張メソッドね。
乱用すんなとは言われてるけど、なかなか便利。


関数リテラル、関数内関数ぐらいは問題なさげ
クロージャは、無限エクステントなしでよければ問題なさげ
それでもforeachみたいなのに渡す分には困らない
値として返せないけど

タグ:

+ タグ編集
  • タグ:
最終更新:2010年04月18日 23:41
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。