問題タブ [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 ++は、不明なクラスのメンバー関数へのポインターを保存します
オブジェクトへのポインターと、既知の署名のメソッドへのポインターを保存したいと考えています。クラスがわかっている場合、このポインターのタイプは次のとおりです。
しかし、型がわからない場合、どうすればポインタを保存できますか?
私はこのようなことをしたい:
method
メソッドへのポインタを格納しmyObject
て後で呼び出すにはどうすればよいですか?
delegates - D C++ メンバー関数ポインターに類似しており、必ずしもデリゲートではない
私は D を学んでおり、特に D のジェネリック プログラミング機能に非常に興奮しています。デリゲートは素晴らしく、メンバー関数ポインターを完全に置き換えたようです。そのため、次のようなものを実装したいときに行き詰まりました。
D の関数ポインターとデリゲートについて私が学んだことによると、関数ポインターはグローバル関数に対してのみ宣言でき、デリゲートはオブジェクトにバインドする必要があるため、どちらもこれを行うことができないということです。 "私が見つけることができます。ここに示すように、呼び出されるメソッドにバインドできる単一のオブジェクトがないため、デリゲートを使用できません。
私はミックスインでそれを行うことができ、本質的にそれをマクロにすることができることを知っています. しかし、これは本当に D のようには聞こえず、「正しい方法」があるべきだと考えました。
c - リンクされたリストを繰り返し逆にしながら、リストがどのように変更されるかを理解しようとする
リンクされたリストを繰り返し逆にする次のコードがあります。
コードでは、currNode、prevNode、および nextNode はすべて、ReverseListIterative() へのローカル ポインターです。元のリストがまだ変更されているのはなぜですか (より正確には、元に戻されます)。使用すべきではありませんか
リストノードの実際のアドレスが変更されるように?
c++ - クラス メンバとしてのクラス メンバ関数ポインタ
fPtr に格納されている関数を呼び出すにはどうすればよいですか? 私が試したとき (*(t->fPtr))(); コンパイラはこれらのエラーを出します:
エラー C2171: '*': タイプ 'void (__thiscall MyClass::* )(void) const のオペランドは無効です
エラー C2064: 項は引数を 0 個取る関数として評価されません
c++ - 関数オブジェクトへのメンバ関数ポインタ
関数ポインターをメンバーとして持つクラスがあります。場合によっては、そのポインターが関数オブジェクトを指すようにしたいのですが、それは不可能ですか?
私は得る:
c++ - 派生クラス関数へのポインタを基本クラスに渡すことができません
派生クラスから関数ポインターを期待する基本クラス関数に関数を渡そうとしていますが、コンパイラエラーが発生します。
これは設計どおりだと思いますが、不快なキャストを伴わない方法はありますか?boost::bind
ここで私を助けることができますか?
ちなみに、私は仮想関数を使用してこれを正常に機能させています。これは、関数ポインターではなく明らかなアプローチですが、後でブースト::バインドのトリックを試みる前に、このように機能させようとしています...
c++ - メンバー関数ポインタをクラスレス関数に渡す
以下のコードでは、メンバー関数を汎用ルートファインダーに渡す方法を理解できません。
ルートファインダーはこのクラスに固有のものではないため、メンバーにしたくありません。すべてを作成するソリューションはstatic
非常にエレガントではないようです。誰かがアイデアを持っていますか?これはよくある状況ですが、私にも理解できる関連する投稿は見つかりませんでした。
ありがとう!
編集:Pseek
実際、私はまた尋ねることを意味しました:私がしたこと以外に変数を設定する適切でスレッドセーフな方法はありますか?明確にするために、私は2次元関数で1次元の求根アルゴリズムを実行していますが、2つの引数の1つを修正しています。
c++ - C++11: const、volatile、左辺値参照、および右辺値参照で修飾されたメンバー関数ポインターを抽象化しますか?
C++03 では、関数パラメーターをconst
、volatile
、左辺値参照 ( &
) として修飾できます。
C++11 では、右辺値参照 ( ) がもう 1 つ追加されます&&
。
さらに、C++ では、パラメーターの修飾子に基づいて関数をオーバーロードできるため、関数を呼び出すときに最も適切なオーバーロードが選択されます。
メンバー関数は、概念的には、追加のパラメーターを受け取る関数と考えることができます。その型は、それがメンバーであるクラスのインスタンスへの参照です。この「追加パラメーター」の修飾子に基づいて、他のパラメーターとほぼ同じ方法でメンバー関数をオーバーロードすることができます。これは、修飾子を関数シグネチャの最後に置くことで表現されます。
C++03 ではconst
andvolatile
修飾子が可能であり、C++11 では&
and &&
(&
理論的には C++03 で許可されていた可能性がありますが、そうではありませんでした) も許可されます。
C++03 では 2^2 = 4 の可能性があり、C++11 では 2^4-4 = 12 の可能性があるため、&
とが相互に排他的であることを除いて、修飾子の任意の組み合わせを使用できます。&&
メンバー関数ポインターを操作したい場合、これは非常に面倒です。なぜなら、これらの修飾子は少しもポリモーフィックではないためです。this
引数として渡されるメンバー関数ポインターの「型」の修飾子は、それらと正確に一致する必要があります。渡されるパラメーターのタイプ。C++ には、修飾子を抽象化するための明示的な機能もありません。const
C++03 では、バージョンと非const
バージョンを記述する必要があり、誰も気にしないため、これはほとんど問題ありませんでしvolatile
たが、C++11 の病理学的ケース (病理学的ほど珍しいことではありません) 12 個ものオーバーロードを手動で作成する必要がある場合があります。機能ごと。
囲んでいるクラスの型をテンプレート パラメーターとして渡し、そこからメンバー関数ポインターの型を派生させると、修飾子const
とvolatile
修飾子が許可され、期待どおりに伝播されることがわかり、とてもうれしく思いました。
これは、すべてのケースを手動で書き出すよりもはるかに優れています。
&
残念ながら、とでは機能しないようです&&
。
GCC 4.7 は次のように述べています。
エラー: 参照型 'Baz&&' へのポインターを形成しています</p>
しかし、4.7 の時点で GCC が の参照修飾子をまだサポートしていないことを考えると、これはそれほど驚くべきことではありませんthis
。
また、そのようなサポートがあるClang 3.0でも試しました。
エラー: メンバー ポインターが非クラス型 'Baz &&' を参照しています
しかたがない。
this type
これは不可能であり、メンバー関数ポインターの " " で参照修飾子を抽象化する方法はないと結論付けて正しいでしょうか? テンプレートパラメータとしてthis
「タイプ」を渡す特定のケース以外の修飾子(特に on )を抽象化するための他のテクニックも高く評価されます。this
(C++ がメンバー関数と通常の関数を区別していない場合、これはすべて些細なことであることに注意してください。テンプレート パラメーターを関数のパラメーター (ポインター) の型として使用すると、テンプレート引数は次のようになります。修飾子はそのままで、余計なことを考える必要はありません。)
c++ - 指定されていないクラス型へのメンバー関数ポインター - 可能ですか?
任意のクラス (読み取り: 特定のクラスではない) のメンバー関数を指すことができる関数ポインター (非 C++ 11) を宣言することは可能ですか?
たとえば、クラス A、B、および C があるとします。C には関数ポインターが宣言されており、そのポインターを B のメンバー関数の 1 つと A のメンバー関数の 1 つを指すように切り替えたいとします。C++ はこれを許可しますか?