問題タブ [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 投票する
1 に答える
934 参照

c++ - C ++:無関係な構造内のクラスメンバー関数へのポインター

私はこれをどうやって行うかについてオンラインで少し読んだことがあり、正しくやっていると思います...私の目標は、クラスのメンバー関数へのポインターを含む構造体オブジェクトの配列を持つことです。

これが私がこれまでに持っているものです...

次に、引数の有無にかかわらず(stuff[0]。*handler)()を使用して関数を呼び出すと(実際には引数リストを使用するつもりです)、「handler」を取得します:宣言されていない識別子...

私は何かが欠けている必要があります、ただ何がわからないのです。

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

c++ - テンプレート基本クラスC++での関数ポインタのオーバーライドの問題

オブザーバーパターンのテンプレート基本クラスを実装しました。

私はこのようなクラスを使用しています

ここでの問題は、コンパイラがテンプレートパラメータを推測できず、テンプレートパラメータを明示的に指定できなかったことです。

誰かがアイデアを持っていますか?

編集:ここでの問題は、テンプレートパラメータを使用した関数呼び出しのオーバーライドです。「Emit」関数は他の関数タイプで正しく機能します。

このパターンの使用法は

ちなみにこれはC++です。

0 投票する
10 に答える
335697 参照

c++ - 関数ポインタを介したC++メンバー関数の呼び出し

クラスメンバー関数の関数ポインターを取得し、後で特定のオブジェクトを使用してそのメンバー関数を呼び出すにはどうすればよいですか?私は書きたいです:

また、可能であれば、ポインターを介してコンストラクターも呼び出したいと思います。

これは可能ですか?もしそうなら、これを行うための好ましい方法は何ですか?

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

c - C: 渡される関数に関数ポインタを渡す

関数ポインターを受け取り、それを別の関数に渡すマッピング関数を作成しようとしていますが、gcc が怒鳴っています。

これが私がやろうとしていることのアイデアです。

gcc の苦情:

警告: 互換性のないポインタ型から 'map' の引数 2 を渡しています

何か案は?

0 投票する
8 に答える
3860 参照

c++ - 自分自身へのポインタを引数として取ることができる関数を宣言できますか?

stackoverflow で質問を読んで、自分自身へのポインターを取る関数を宣言できるかどうか疑問に思いました。つまり、次のように を宣言するfooと、次のようになります。

最も単純なアイデアは、別の関数ポインターにキャストすることです (void*小さい可能性があるため、 にキャストすることはできません)。したがって、関数宣言は次のようになります。

それは C では問題ありませんが (C++ でのキャストでも機能します)、そのようなハードな「再解釈」キャストや型情報の損失なしに実行できるかどうか疑問に思います。

つまり、次の宣言が必要です。

しかしもちろん、無制限の宣言は不可能です。ナイーブtypedefも役に立ちません。

foo(foo)C++ テンプレートは、呼び出しコード ( ) が少し簡潔に見えなくても歓迎されますが、それでも有限です。

キャストせずに型情報を削除する方法、またはそのような他のトリックを示すCスタイルの回答は、もちろん興味深いですが、受け入れられません。

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

java - Javaのデリゲートのマップ

インタラクティブなJavaプログラム用の非常に単純なコマンドラインライブラリを作成しようとしています。Javaプログラムを起動すると、コマンドの入力を求められます。構文は次のとおりです。

例えば:

ここaction = "addUser", object_1 = "name", object_2 = "John Doe", object_3 = "age", object_4 = "42"に。

アクションの後はすべてオブジェクトです(つまり、アクションはオブジェクトを使用します)。アクションとオブジェクトが単純な文字列であることがわかります。必要に応じて、オブジェクト文字列を数値に変換することもできます。

私の計画では、このコマンドラインライブラリのユーザーは、(適切なJavaオブジェクトに属する)メソッドを作成し、各メソッドを特定のアクションに割り当てるだけです。コマンドラインのオブジェクトは、ユーザーが割り当てるメソッドのパラメーターになります。上記の例のメソッドを実装する適切なクラスは次のとおりです。

ユーザーがコマンドを入力すると、プログラマーによって割り当てられた対応する関数が、コマンドラインで指定されたパラメーターを使用して呼び出されます。

Javaには関数ポインター(Cなど)やデリゲート(C#など)がなく、コールバックを実装する方法はインターフェイスを介することを知っていますが、このシナリオでインターフェイスを使用する方法がわかりません。私がインターフェースで見る問題は、それらが持っているということです:

  1. 実装する関数の数は固定されています
  2. 実装する関数の宣言は固定されています。

(1)の問題は、私のライブラリのユーザーが、サポートしたいアクションの数だけ、任意の数の関数を実装することを決定する可能性があることです。(2)の問題は、ユーザーが「addUSer」アクションのaddUserHandler()のように、わかりやすい名前で関数を割り当てたいということです。

Javaにデリゲートまたは関数ポインターがある場合は、文字列(アクションを表す)とデリゲート(プログラムでのアクションの実際の実装用)の間にマップを作成するだけです。Reflectionを使用してデリゲートをエミュレートできると思いますが、クラスとメソッドに文字列名を使用する必要があるため、これは面倒で型の安全性が失われます。より良い方法はありますか?

ありがとう、

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

c++ - オブジェクトへの2つのポインタを最も派生した型で比較する方法は?

次のクラス階層があります。

Derived4 と同様のクラスを比較する Base::equal(Base *) 関数をどのように記述すればよいですか? これらにはデータ フィールドがないため、実際のオブジェクトが同じ派生クラスであることのみを確認してください。

Derived1::equal(Base) の書き方 - Derived2 と Derived3 は類似しており、データ フィールドがなく、Derived1 のデータ フィールドで比較し、オブジェクトが同じ派生クラスからのものであることを確認する必要があります。

更新:次のような各派生クラスに同一の関数を記述したくないため、これが必要です。

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

c++ - 静的メンバーとしてのC++関数ポインター

関数ポインタを静的メンバーとして宣言するための構文を理解できません。

g++は「`void'メンバーへのポインタを宣言できません」というエラーを出力します。かっこを使って何かをする必要があると思いますが、void A ::(* cb)=NULLも機能しません。

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

c++ - バイナリデータから関数を呼び出す方法

たくさんの関数を含むバイナリデータがあり、そのうちの1つを呼び出したいと思います。これらの関数の署名と、ファイルの先頭からの相対的なオフセットを知っています。呼び出し規約がデフォルトです:__cdecl。ファイルは、実行権限のあるメモリページにすでにロードされています。

たとえば(、、、Aいくつかのタイプです)BC

どうすればそのmyOffsetポイントを指定できますmyFunctionか?

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

c++ - 関数ポインタ間でキャストする

私は現在、DonClugstonのfastdelegatesを使用してタイマー/コールバックシステムを実装しています。(http://www.codeproject.com/KB/cpp/FastDelegate.aspxを参照)

開始コードは次のとおりです。

さて、しかし今、私はユーザーがTimerContext自分の構造を保存してコールバックに送信するためにサブクラス化できることを望んでいます。ここでの目的は、ユーザーがTimerContext自分自身をダウンキャストする必要がないようにすることです。

ご想像のとおり、GCCは私にそれをさせません:)

だから今私の質問は:私がキャストを使用して強制するとreinterpret_cast、それは機能しますが、それは安全ですか?

PS:これらはタイムクリティカルなコールバックであり、重い仮想指向のソリューションは実行不可能と見なされます:/