私はすべての同様の質問を調べましたが、この特定のシナリオは出てこなかったようです。
私はプラグインシステムを持っています。プラグインはフックを挿入したいときに呼び出す関数のアドレスを受け取ります(これはクラス関数です)。
プラグイン:
struct plugin {
...
bool (*insert_hook)(hook_data*);
...
};
クラス:
class manager {
...
private:
InsertHook(hook_data *hook);
...
};
マネージャの作成機能:
{
...
typedef bool (manager::*InsertHookFunc)(hook_data*);
InsertHookFunc hook_func = &manager::InsertHook;
// assigning this to the plugin ???
// C2440, cannot convert from 'hook_func' to 'bool (__cdecl *)(hook_data *)'
plugin->insert_hook = hook_func;
...
}
マネージャーはプラグインを呼び出します。プラグインがフックを挿入する必要がある場合は、マネージャーを呼び出す必要があります。
このようにするための正しい方法は何ですか?私はそれが正常に機能することを知っています(プラグインはプラグインオブジェクトを要求するためにクラス作成関数への関数ポインターを渡されます)が、それがクラス関数であるため(非クラス関数を使用して、この割り当ては正常に機能します)。
マネージャーの友達としてクラス以外の関数を作成することもできますが、これは直接実行できると確信しています。理解できません...