ホームページ >バックエンド開発 >C++ >C クラスのメンバー関数を C コールバックとして登録するにはどうすればよいですか?

C クラスのメンバー関数を C コールバックとして登録するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-11 19:36:14715ブラウズ

How Can I Register C   Class Member Functions as C Callbacks?

C クラスのメンバー関数を C コールバック関数として登録する

コールバック関数を必要とする C ライブラリを操作する場合、登録が必要になる場合があります。 C クラスのメンバー関数。ただし、非静的メンバー関数をコールバックとして登録しようとすると、コンパイラ エラーが発生します。

C クラス メンバー関数を登録できますか?

はい、可能です。静的メンバー関数を使用して、C クラスのメンバー関数をコールバック関数として登録できます。

静的メンバー関数アプローチ

静的メンバー関数には、クラス型の暗黙的な最初のパラメーターがありません。したがって、それらの署名はコールバック関数の予期されるタイプと一致し、正常に登録できます。

class A {
public:
    static int e(int *k, int *j) {
        return 0;
    }
};

A::A() {
    register_with_library(A::e);
}

代替アプローチ

  • 関数ポインター: C メンバー関数を指す関数ポインターを指定し、ライブラリに登録します。
int e(int *k, int *j) {
    A a;
    return a.e(k, j);
}

A::A() {
    register_with_library(e);
}
  • ファンクター: Operator() をオーバーライドするファンクター クラスを作成します。 C メンバー関数を呼び出します。ファンクターのインスタンスをコールバックとして登録します。
struct EF {
    A* a;
    int operator()(int *k, int *j) {
        return a->e(k, j);
    }
};

A::A() {
    EF ef = {this};
    register_with_library(ef);
}

アプローチの選択は、C ライブラリの特定の要件と、必要なカプセル化と再利用性のレベルによって異なります。

以上がC クラスのメンバー関数を C コールバックとして登録するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。