C++なら関数オブジェクト使えとかいう記述をどこかで見かけたんだけど、結局よくわからなかったので関数ポインタを使う事にした。
引数の型 (*関数ポインタ名)(その関数がとる引数の型)
という形で宣言して使う。
例えばintで1つ引数をとって、5足したものを返してくれる関数を考えてみる。
[cpp]
int calc(int in){
return in+5;
}
int main(){
int (*fp)(int);
fp = calc;
fp(2) // 7が返ってくる
return 0;
}
[/cpp]
細かいアレはともかくとして、fpが関数ポインタ。こういう使い方だと今のとこあんま面白くないけど、関数ポインタを使えば関数の引数に関数を使える。
与えられた関数から返ってきた値の正負を判定する関数pmを考える。
[cpp]
int calc(int in){
return in+5;
}
bool pm(int (*fp)(int), int in){
if(fp(in)<0){
return false;
}else{
return true;
}
}
int main(){
pm(calc, -6) //false
pm(calc, 3) //true
return 0;
}
[/cpp]
使いどころは、計算の一部分を利用者から与えてもらって、それを使って全体の計算をやるって場面。(ていうかそういう場面があったのでこうやって書きました)
具体的に言うと、数値解析のときにつかうテクニックがあるんだけど、これを毎度書いてるとウザいので、オレオレライブラリにしてやろうという感じ。テクニックのアルゴリズム自体はライブラリ側で全部書いておいて、利用者は目的関数の定義だけしてあとはそれを放り込むだけ〜というやつ。
ぶっちゃけこういう内容1年くらい前にやるべきみたいな雰囲気はある(今年度何した?に答えたくない)