C++でほぼ毎回同じ内容をだが、その関数ポインタを他の関数に渡さなければならない状態になった。しかし、ほぼ変わらない内容の関数を毎回書くのはとても面倒なので、関数ポインタを返す関数を作成することにした。
状況を整理すると次のようになる。
- void functionA(void (*)(int, int))に関数ポインタを渡したい。このインターフェースは変更不可。
- void functionB(int, int)を毎回書くのは面倒。
- functionB内部では2つdouble値が状況によって変更する必要がある。
- 戻り値がvoid (*)(int, int)のgetFuncPointer(double, double)という関数がほしい。
- functionA(getFunPointer(double, double))とすればOKとしたい。
ここで素直に作れずに壁になった部分は
- 関数内には関数を宣言できない
- 関数内に構造体を作ってメンバ関数を返すと型に構造体名が入り、void型ではなくなってしまう
試行錯誤の末にこんな感じになった。
=== in getfunc.h ===
typedef void (*PFUNC)(int, int);
PFUNC getFuncPointer(double a, double b);
=== in getFunc.cpp ===
struct FUNC_PARAM{
double a;
double b;
}fPrama;
void functionB(int c, int d){
otherFunc(c / fParam.a + d / fParam.b);
}
PFUNC getFuncPointer(double a, double b){
fParam.a = a;
fParam.b = b;
return functionB
}
=== in Main.cpp ===
#include <functionA.h>
#include "getFunc.h"
int main(){
functionA(getFuncPointer(1.0, 2.0));
return 0;
}
こうすることで、何とか意図した動作をしているようだ。functionBとFUNC_PARAM構造体は他から利用できないようになっているし、functionBの挙動もgetFuncPointer関数への引数で変更することができる。なんだか無理矢理な感じはするが、やりたかったことはできた。
もっとスマートな方法がないものだろうか。
コメント