問題タブ [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.
c++ - C++ 継承とメンバー関数ポインター
C++ では、メンバー関数ポインターを使用して、派生 (または基本) クラスのメンバーを指すことはできますか?
編集:おそらく例が役立ちます。継承順に
3 つのクラスX
、Y
、の階層があるとします。したがって、基本クラスと派生クラスがあります。Z
Y
X
Z
p
これで、 classのメンバ関数ポインタを定義できますY
。これは次のように書かれています。
(簡単にするために、署名付きの関数のみに関心があると仮定しますvoid f()
)
このポインターp
を使用して、 class のメンバー関数を指すことができるようになりましたY
。
この質問(実際には2つの質問)は次のとおりです。
p
派生クラスの関数を指すために使用できますZ
か?p
基本クラスの関数を指すために使用できますX
か?
c++ - メソッドへのポインタを返すメソッドへのポインタをtypedefする方法は?
基本的に私は次のクラスを持っています:
メソッド stateA() および stateB() は、stateA() および stateB() へのポインターを返すことができる必要があります。StateMethod を typedef する方法は?
c++ - 仮想メンバー関数へのポインター。それはどのように機能しますか?
次の C++ コードを検討してください。
推測する必要がある場合、通常のメンバー関数と仮想メンバー関数へのポインターの間に明示的な分離がないため、このコンテキストでの &A::f は「A の f() の実装のアドレス」を意味すると言えます。 . A は f() を実装していないため、コンパイル エラーになります。しかし、そうではありません。
それだけではありません。次のコード:
実際に B::f を呼び出します。
それはどのように起こりますか?
c++ - メンバー関数へのポインターをハッシュして比較する方法は?
c++ メンバー関数へのポインターをハッシュ (std::tr1::hash または boost::hash) するにはどうすればよいですか?
例:
クラス Class のいくつかの異なるメソッドを指すいくつかの bool (Class::*functionPointer)() (静的ではない) があり、それらのポインターからメンバー関数をハッシュする必要があります。
どうやってやるの?
また、これらのメンバー関数ポインターを比較 (std::less) して、std::set に格納できるようにするにはどうすればよいですか?
c++ - 一般的な「getData」関数を作成するにはどうすればよいですか?
たとえば、「CDownloader」というクラスがあります。このクラスは、いくつかのXMLデータを読み取り、ノード名によるアクセスを提供します。これは、次のようないくつかのゲッター関数を備えています。
CDownloaderクラスを変更できません。代わりに、実際の名前ではなく、boolフラグを使用してアイテムをダウンロードする関数をいくつか作成したいと思います。このようなもの:
Download(Font | Integer | Image)関数を個別に記述できますが、これによりコードが重複します。私の考えはテンプレートを作成することですが、それでも途方に暮れています。CDownloaderクラスからどのメソッドを呼び出す必要があるかをどのように判断できますか?データ型ごとにテンプレートを特殊化するということは、コードの重複に再び固執することを意味します。ゲッター関数を「関数へのポインター」パラメーターとして渡すには?しかし、ゲッターの署名はCDownloaderでは異なります...
要約すると、質問は次のとおりです。CDownloaderの周りにジェネリックラッパーを作成することは可能ですか、それとも「get ***」関数ごとにコードを複製する必要がありますか?前もって感謝します!
c++ - C++ メンバー関数ポインターと STL アルゴリズム
operator() をオーバーロードする抽象ファンクター クラスと、それを実装する派生オブジェクトがあります。
これらのファンクター クラスの配列を取り、メンバー関数へのポインターを std アルゴリズム for_each() に渡そうとする関数 (別のクラスの一部) があります。
編集:私はそれを再洗浄し、明確にするために古い小さな例を入れました。
いくつかの方法を試しましたが、それを機能させる方法がわかりません。異なる派生型を持つことができるため、抽象型を使用する必要がありますが、それらはすべて同じ operator()(param x を実装する必要があります) 関数。
メンバ関数 operator()(param x) を呼び出せるようにするには、for_each() 関数が必要です。具体的な実装があり、それらのインスタンスを渡すだけで機能する別の関数があります。ここで同様の効果を達成しようとしていますが、どの具体的なクラスが与えられているかを知りません。
私は何を間違っていますか?
c++ - メンバー関数ポインターを再解釈することは「良い考え」ですか?
「スレッド アクション」のリストを保持するワーカー スレッドがあり、それらを when として処理します。
通常はこのように呼びます
それまではうまくいきました
に変更されました
残念ながら、他のものには新しい形式が必要なので、再度変更することはできません (また、オーバーロードは戻り値の型だけで異なるわけではありません)。
私は試しました
これはうまく機能しているように見えますが、このような関数ポインターの再解釈が「定義済み」の動作であるかどうかはわかりません。誰かアドバイスしてもらえますか?
c++ - C++ メンバー関数ポインターの比較
C++ では、メンバー関数へのポインターの並べ替え順序を定義することは可能ですか? operator< が定義されていないようです。また、void* へのキャストは違法です。
ありがとう!
c++ - C++ のメンバー関数への関数ポインター
関数ポインターを期待するメソッドを呼び出す必要がありますが、実際に渡したいのはファンクターです。これが私がやろうとしていることの例です:
最後の行、printer(g, 4) をコンパイルする方法を見つけることができませんでした。これを機能させる方法はありますか?私のコントロール内にあるのは、メソッド「main」とクラス「adderClass」だけです。
c++ - const メンバ関数ポインタの特殊化
いくつかのユーティリティ コードを const メンバー関数に特化しようとしていますが、単純なテスト ケースを機能させるには問題があります。
作業を簡素化するために、Boost.FunctionTypesとそのcomponents<FunctionType>
テンプレート ( const メンバー関数のタグとなるMPL シーケンス) を利用しています。contain
const_qualified
しかし、以下のテスト コードを使用すると、const メンバー関数の特殊化は失敗します。誰かがそれを機能させる方法を知っていますか?
テストコードが出力されます (VC8 とブースト 1.40 を使用):
非定数
非定数
予想される出力は次のとおりです。
非定数
定数
テストコード自体: