問題タブ [member-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++ - メンバーにアクセスするメンバー関数としてグローバル テンプレート関数を実装する
免責事項: 以下を実装するためのより良い方法が多数あることは知っていますが、テンプレートとメンバーへのポインターについてさらに学習する方法としてこれを行っています。私はそれらをいじっていますが、次のことが可能かどうかを確認したいと思います。
非静的メンバー関数として機能する非メンバーテンプレート関数が必要です。さまざまなクラスがそれを独自に実装し、関数が影響するデータ メンバーを設定できます。
add10ToMember
この例では、指定されたメンバーに 10 を加算する単純な関数であるテンプレート関数を作成しました。
DoubleHolder
orのオブジェクトをインスタンス化するとすぐにIntHolder
、コンパイルが失敗し、次のようなエラーが表示されます。 'int IntHolder::* '".
エラーが発生する理由を理解しています:add10ToMember
実際にはどちらを認識していないかDoubleHolder
、IntHolder
操作を実行する必要があります。add10ToMember<IntHolder, int, &IntHolder::value>
実際のメンバー関数にはなりません。IntHolder
それはまだ、指定されていないインスタンスに影響を与える単なるグローバル関数です。
しかし、これではないにしても、私が望むものを書く正しい方法が何であるかがわかりません。それは可能ですか?
c++ - メンバー関数へのポインターは仮想ディスパッチを実行しますか?
次のコードを実行しました。
私の予想される出力はBase func called
. ただし、代わりに、出力は
メンバーfunc_ptr
のみを表示できるはずだと思うので、これは私を驚かせました(を介してメンバー関数にアクセスするのではなく、関数アドレス自体にアクセスすると思ったからです。Base
func_ptr
_vptr
この場合に仮想ディスパッチがどのように行われるか(仮想テーブルへのアクセスがどのように行われるか)、およびこの動作がC++標準で定義されている場所(何も見つかりませんでした)を知りたいですか?