通常、これはstatic
メンバー関数 (引数としてポインターを取る) を使用します。この場合、objectToUse
がパラメーターとして渡され、MyMemberFunction
を使用objectToUse
してオブジェクトへのポインターを設定し、MyClass
それを使用してメンバー変数を参照し、メンバー関数。
この場合Connect
、次のような内容が含まれます。
void Connect(void *objectToUse, void (*f)(void *obj))
{
...
f(objectToUse);
...
}
[ and が、実際に Connect 内ではなく、後で使用するためにどこかに保存される可能性もf
十分objectToUse
にありますが、その場合でも呼び出しは同じように見えます - この関数がイベントの結果として呼び出された他の関数からだけです。呼ばれることになっています]。
メンバー関数へのポインターを使用することも可能ですが、それは非常に複雑であり、構文と「いつ、どのように正しく使用できるか」の両方に関して、「正しく理解する」ことはまったく簡単ではありません。詳しくはこちらをご覧ください。
この場合、次のConnect
ようになります。
void Connect(MyClass *objectToUse, void (Myclass::*f)())
{
...
objectToUse->*f();
...
}
テンプレートが使用されている可能性が非常に高く、Connect クラスで "MyClass" が認識されているかのように、関数ポインターを使用しても意味がありません。仮想関数の方がはるかに適しています。
適切な状況があれば、仮想関数をメンバー関数ポインターとして使用することもできますが、「一緒に遊ぶ」にはコンパイラー/環境が必要です。この件に関する詳細は次のとおりです [これについては、個人的な経験はまったくありません: 仮想メンバー関数へのポインター。それはどのように機能しますか?
Vlad はまた、関数をラップするオブジェクトである Functors を指摘し、特定の動作を持つオブジェクトを「関数オブジェクト」として渡すことを可能にします。通常、これには定義済みのメンバー関数、またはoperatorXX
コードにコールバックする必要がある関数の処理の一部として呼び出される が含まれます。
C++11 では、コード内でオンザフライで宣言された名前のない関数である「Lambda 関数」を使用できます。これは私がまったく使用したことがないものなので、これ以上コメントすることはできません - 私はそれについて読んだことがありますが、私の(趣味の)プログラミングでそれを使用する必要はありませんでした - 私の仕事の人生のほとんどは私は C++ で 5 年間働いていましたが、C++ ではなく C を使用していました。