そのフィールドとして関数へのポインターと、保持している構造体へのポインターが引数であるように保持できるクラスが必要です。そのオブジェクトのインターフェースは、引数を取らずに保存された引数を上記の関数に渡すメソッドcall()になります。さまざまな引数のタイプとカウントに対するこのようなクラスのファミリーには、仮想の呼び出しを持つ共通の抽象祖先があります。
今のところ、次のコードが機能しますが、g++に-pedanticオプションを追加するとエラーが発生します。
class Function {
protected:
void *data;
void *function;
public:
virtual void call() = 0;
};
class SingleArgumentFunction : public Function {
public:
SingleArgumentFunction( void (*f)(int), int i ) {
int *icpy = new int(i);
function = (void*) f;
data = (void*) icpy;
}
~SingleArgumentFunction() { delete (int*)data; }
inline void call() {
( *((void (*)(int))function) )( *(int*)data );
}
};
私が得るエラーは、タイトルが言うようにです:
warning: ISO C++ forbids casting between pointer-to-function and pointer-to-object
それをどのように処理しますか?