1

非静的メソッドへのポインターを理解したので、それらは特定のメソッドにエイリアス メカニズムを提供する以外には役に立ちません。たとえば、3 つのメソッドを持つオブジェクトがあるとします。

 class Provider
 {
 public:
 int A(int in);
 int B(int in);
 int C(int in);
 }

プロバイダーメソッドへのポインターを必要とするコンシューマー (A、B、または C)。3 つのメソッドのいずれかへのポインターをいわゆるコンシューマーに与えるコントローラーを使用すると、コンシューマー コードにプロバイダー インスタンスを使用する何かを記述し、コントローラーが送信した内容に応じて A、B、または C のいずれかへのポインターを作成できます。 .

これが C++ の非静的メソッドへのポインターでできることのすべてである場合、そのメソッド ポインターと共にオブジェクトを消費者に送信せずに、オブジェクトのメソッドへのより「インテリジェントな」ポインターを提供する方法はまだありますか? 肯定的な場合、イディオム/メカニズムは何と呼ばれていますか (これをシミュレートする方法でさえ、私が興味を持っている答えとして適格です)。

4

3 に答える 3

6

メンバー関数ポインターの概念は一般的に正しいです。

std::bindメンバー関数ポインターは、 やなどのヘルパーへの結合で実際に非常に便利ですstd::function。通常、生のメンバー関数ポインターは醜いです。

あなたの例については、

コンシューマーは受け入れるstd::function<return_type(args)>ことができ、オブジェクトとそのメンバー関数のバインディングをそのようなコンシューマーに渡すことができます。

このような構造体は、部分的な特殊化やカリーstd::bind化などの概念の実現も可能にします。

于 2012-08-20T11:37:51.783 に答える
1

呼び出されるメソッドへのポインタを使用してオブジェクトへのポインタを接着する必要はありません。インスタンスへのポインタをいつでも提供できます。

class CClass {
public:
    void func(int a) {}
};

///
std::function<void(CClass&, int)> call_func = &CClass::func;

///
CClass cls1;
CClass cls2;
call_func(cls1, 1);
call_func(cls2, 2);
于 2012-08-20T11:50:06.293 に答える
1

「メンバー関数へのポインター」の要点は、(正しいクラスの)任意のオブジェクトで名前付きメソッドを呼び出すことができるようにすることです。いいえ、オブジェクト参照をポインター内に「隠す」方法はありません。

このようなものに対しては、いつでも独自のラッパーを作成できます。これは、手元のアプリケーションにより便利な API を提供するために、C++ のさまざまなコールバック メカニズムが行うことです。

于 2012-08-20T11:21:41.923 に答える