問題タブ [member-function-pointers]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
3940 参照

lambda - メンバー関数を渡すための C++0x ラムダ ラッパーとバインド

これは基本的に、クラス コンストラクター/メソッド内からメンバー メソッドを指すファンクターを作成/渡すための 2 つの異なるアプローチの読みやすさ、スタイル、パフォーマンスに関する質問です。

アプローチ 1:

アプローチ 2:

この状況でラムダを使用するのは無償であるかどうか疑問に思っていました。いくつかの点で何が起こっているのかを簡単に確認できますが、引数の型を明示的に指定する必要があります。また、「名前空間を何でも使用する」ことは好まない。しかし、バインド式が不必要に冗長になり (たとえば、_1 が std::placeholders::_1 になる)、ラムダはこの問題を回避します。

最後に、この質問の目的のために、 some_method は多くのことを行う大きな関数であり、ラムダ本体に直接コピーするのは面倒であることに注意してください。

この質問が漠然としすぎているように思われる場合は、パフォーマンスの違いがあれば、それに対する回答に焦点を当てることができます。

編集:自明ではないユースケース。

ご覧のとおり、イニシャライザ リスト (アプローチ 1 または 2 で定義) で使用される CALLBACK_FUNCTOR により、using 宣言のスコープが難しくなり (afaik)、すぐに呼び出す予定のメンバー メソッドをわざわざラップする必要がないことは明らかです。

0 投票する
3 に答える
568 参照

c++ - プライベート ベースを持つ関数メンバー ポインター

次のコードでは、コンパイル時エラーが発生します。

' base::print': クラス ' base_der'で宣言されたプライベート メンバーにアクセスできません

ただし、public派生クラスでメンバーを作成しました。なぜこれが機能しないのですか?

0 投票する
2 に答える
706 参照

c++ - const-correctness と安全な bool イディオム

安全な bool イディオムに関連する別の質問があります。

bool_type(typedef) とthis_type_does_not_support_comparisonsはどうしてconstですか? とにかく、誰も実際に戻りポインターを介してメンバー関数を呼び出すことは想定されていませんよね? ここはconst必要ですか?operator bool_typeそうでなければ、(メンバー関数は) const-correctness に違反しますか?

0 投票する
2 に答える
336 参照

c++ - 関数ポインタへのC++オブジェクト関数

C++アプリ内でCライブラリを使用しています。ライブラリには、次の署名を持つ関数があります。

関数をコールバックとして設定しようとしていますが、次のクラスメンバー関数を使用できるようにしたいと思います

直接バインドすることはできず、ここに基づいていますhttp://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.2静的なものを作成する可能性のある解決策がありますコールバックを処理するメンバー(そのサイトに基づいているため、問題ないはずです)と、静的メンバーが呼び出すこのクラスの静的インスタンスを追加します。

つまり、BattleScreenに以下を追加します。

次のようにコンストラクターでバインドします。

コンストラクターでオブジェクトをcallbacktargetに割り当てます。

問題は、一度にこれらのクラスがいくつあるかを知る方法がないことです(最小になりますが、1より大きくなる可能性があります)。callbacktargetをBattleScreen*のベクトルにして、TopLevelHandleWebViewCallbacks内で反復処理し、次のように比較できるようにすることを検討しました。

しかし、ここでの問題は、私がawe_webviewポインターを比較しているだけであり、これは本当に悪い考えのように思われることです。ライブラリはクローズドソースであり、awe_webviewはC構造であるため、それらを構成するものと、より適切な比較を行うプロパティがあるかどうかを確認できません。これに対する良い解決策はありますか?

不明な点がある場合、または追加情報が必要な場合はお知らせください。

前もって感謝します

0 投票する
2 に答える
3050 参照

c++ - C++: メンバー関数で関数ポインターを使用する

関数を別の関数にパラメーターとして渡そうとしていますが、両方とも同じクラスのメンバー関数になっています。

奇妙なエラーが発生し、何が問題なのかわかりません。

ここに私の機能があります:

ただし、次のエラーが発生します。

それで、何が得られますか?これを機能させるために、あらゆるバリエーションを試したような気がします。メンバー関数に関数ポインタを渡すことさえできますか? どうすればこれを機能させることができますか?

注: functionToPass を static にすることは、実際には有効なオプションではありません。

0 投票する
4 に答える
5363 参照

c++ - C++ メンバ関数ポインタ、boost::signals

次の状況があります(コードの方が優れています)

問題は、「メンバー関数」ポインターを Register メソッドに渡す方法です。また、これは大丈夫ですか?私が欲しい/必要としているのは、ある種の代理人登録システムです。誰かが私を正しい方向に向けることができれば、感謝します。事前にサンクス。

0 投票する
3 に答える
756 参照

c++ - イベントコールバックデーモン

メンバー関数のコールバックを使用したいC++のイベントデーモンに取り組んでいます。基本的に、イベントキューは、デーモンが継続的に処理するイベントを収集します。IDを持つ基本クラスのEvent構造体があり、すべてのイベントはそれから派生します。各イベントに登録されているメソッドで、派生イベントタイプをシグネチャで使用するようにしたいと思います。

次に、デーモンは、これらのクラスが「this」ポインターを使用してメンバー関数をサブスクライブできるようにします。

したがって、このクラスの外では、次のようなことができます。

そして、EventDaemonループは

だから私の質問は、イベントIDによって'this'ポインタとメンバー関数ポインタをある種の配列に格納する方法です。そうすれば、再解釈キャストにe-> eventIdとイベントタイプを使用して、「classInstancePtr」と「funcPtr」を検索できます。

0 投票する
3 に答える
692 参照

c++ - アクセスできないベースのメンバー関数へのポインター

次の例のコンパイル:

次のエラーで失敗します:

AはBのアクセス可能なベースではないことを理解していますが、usingキーワードを使用しています。関数fooへのアクセスを許可するべきではありませんか?

上記のコンパイルを妨げる規格の関連する段落は何ですか?

0 投票する
3 に答える
2165 参照

c++ - メンバー関数の非ポインター型定義は許可されていませんか?

この質問に対する回答を得た後、関数ポインターを型定義する有効な方法が 2 つあることを発見しました。

私は今それを好みますFunction * pPFunction q、どうやらこれはメンバーへのポインター関数では機能しません。この不自然な例を考えてみましょう。

しかし、それを新しい優先スタイル: typedef void (Base :: Callback) ()andに変更するとCallback * cb、次の時点でコンパイラ エラーが発生します。typedef

メンバー 'Callback' の追加修飾 'Base::'

エラーのデモ

これが許可されないのはなぜですか?それは単なる見落としですか、それとも問題を引き起こすのでしょうか?

0 投票する
1 に答える
5487 参照

c++ - libevent を使用したメンバー関数へのコールバック

コールバックとして扱われるべきメンバー関数をlibeventに渡そうとしています。

クラス A のeventcbへのメソッド ポインターを正常に作成し、それを A のインスタンス (行 20) で呼び出すことができます。

また、行 22 でグローバル関数を (C で行うように) 渡すことも正常に機能します。

ただし、行 23 で、メソッド ポインターをlibeventに渡そうとしました。これをコンパイルすると、( clangコンパイラーを使用して) 次のエラーが発生します。

私は何を間違っていますか?