問題タブ [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.

0 投票する
0 に答える
51 参照

c++ - メンバーにアクセスするメンバー関数としてグローバル テンプレート関数を実装する

免責事項: 以下を実装するためのより良い方法が多数あることは知っていますが、テンプレートとメンバーへのポインターについてさらに学習する方法としてこれを行っています。私はそれらをいじっていますが、次のことが可能かどうかを確認したいと思います。

非静的メンバー関数として機能する非メンバーテンプレート関数が必要です。さまざまなクラスがそれを独自に実装し、関数が影響するデータ メンバーを設定できます。

add10ToMemberこの例では、指定されたメンバーに 10 を加算する単純な関数であるテンプレート関数を作成しました。

DoubleHolderorのオブジェクトをインスタンス化するとすぐにIntHolder、コンパイルが失敗し、次のようなエラーが表示されます。 'int IntHolder::* '".

エラーが発生する理由を理解しています:add10ToMember実際にはどちらを認識していないかDoubleHolderIntHolder操作を実行する必要があります。add10ToMember<IntHolder, int, &IntHolder::value>実際のメンバー関数にはなりません。IntHolderそれはまだ、指定されていないインスタンスに影響を与える単なるグローバル関数です。

しかし、これではないにしても、私が望むものを書く正しい方法が何であるかがわかりません。それは可能ですか?

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

c++ - メンバー関数へのポインターは仮想ディスパッチを実行しますか?

次のコードを実行しました。

私の予想される出力はBase func called. ただし、代わりに、出力は

メンバーfunc_ptrのみを表示できるはずだと思うので、これは私を驚かせました(を介してメンバー関数にアクセスするのではなく、関数アドレス自体にアクセスすると思ったからです。Basefunc_ptr_vptr

この場合に仮想ディスパッチがどのように行われるか(仮想テーブルへのアクセスがどのように行われるか)、およびこの動作がC++標準で定義されている場所(何も見つかりませんでした)を知りたいですか?