シグネチャは同一ですが、異なるクラスの非スタティックメンバ関数の参照を、一致するシグネチャを持つファンクションポインタに割り当てるにはどうすればよいですか?C++ファンクションシグネチャが一致する任意のクラスのメンバ関数へのポインタ
これは、C++標準ライブラリのstd::function
の助けを借りて行うことができます。私はまた、通常のCの関数とstdライブラリからの助けを借りてこれをいつも行います。私はファームウェアを書いており、コードスペースは限られています。 C++標準ライブラリのヘルパーがそれを行うことができれば、純粋にC/C++言語構造(pre C++ 11が望ましい)を使用して手動で行うことができるはずです。私の意図を証明
例コード:
class A {
public:
void ping_event_handler();
};
class B {
public:
void ping_event_handler();
};
void A::ping_event_handler_A() {
// Handle ping event in A...
}
void B::ping_event_handler_B() {
// Handle ping event in B...
}
void ping_event_handler_C() {
// Handle ping event in normal function...
}
int main() {
// Ping event "pointer to a function that takes no arguments"
void (*ping_event)();
A a();
B b();
ping_event = a.ping_event_handler; // Attach class A's handler
ping_event(); // Trigger event
ping_event = b.ping_event_handler; // Attach class B's handler
ping_event(); // Trigger event
ping_event = ping_event_handler; // Attach non-class handler
ping_event(); // Trigger event
}
開始するために、 '( ); '間違っています。これは関数 'a'を宣言しています –
' ping_event = a.ping_event_handler; ' - ' this'に与えるべき値をコンパイラがどのように知っていますか? –
これらのメソッドを静的(オブジェクトの状態を必要としない場合)または仮想(共通基本クラスから継承)と宣言し、関数へのポインタを基本クラスへのポインタで置き換えます。関数へのポインタとメソッドへのポインタを混在させたい場合は、std:functionとしていくつかのラッパーが必要です。 – avsmal