タグ付けされた質問 「function-pointers」

関数ポインタは、変数に格納できる関数へのポインタです。実行する関数を実行時に選択できます。

11
Cの関数ポインタはどのように機能しますか?
最近、Cで関数ポインタを使用した経験があります。 それで、あなた自身の質問に答えるという伝統を続けて、私はその主題に素早く飛び込む必要がある人々のために、非常に基本的なことの小さな要約を作ることにしました。
1233 c  function-pointers 


21
Javaの関数ポインターの最も近い代替物は何ですか?
約10行のコードを使用するメソッドがあります。コードの1行を変更する小さな計算を除いて、まったく同じことを行うメソッドをさらに作成したいと思います。これは関数ポインターを渡してその1行を置き換えるのに最適なアプリケーションですが、Javaには関数ポインターがありません。私の最善の選択肢は何ですか?

8
一致する関数ポインターを呼び出すためのタプルの「アンパック」
std::tupleさまざまな数の値を保存しようとしています。これらの値は、保存された型と一致する関数ポインターへの呼び出しの引数として後で使用されます。 私が解決するのに苦労している問題を示す簡単な例を作成しました: #include <iostream> #include <tuple> void f(int a, double b, void* c) { std::cout << a << ":" << b << ":" << c << std::endl; } template <typename ...Args> struct save_it_for_later { std::tuple<Args...> params; void (*func)(Args...); void delayed_dispatch() { // How can I "unpack" params to call func? …

7
Cの関数ポインターのtypedefについて
引数を持つ関数へのポインタのtypedefを持つ他の人々のコードを読んだとき、私はいつも少し困惑してきました。少し前にCで記述された数値アルゴリズムを理解しようとすると、このような定義に取り掛かるのにしばらく時間がかかったことを思い出します。では、関数へのポインタの良いtypedefを作成する方法(することとしないこと)に関するヒントと考えを共有して、なぜそれらが役立つのか、他の人の作業をどのように理解するのかについて教えてください。ありがとう!

3
関数ポインターの定義がアンパサンド「&」またはアスタリスク「*」をいくつ使用しても機能するのはなぜですか?
なぜ次のように機能するのですか? void foo() { cout << "Foo to you too!\n"; }; int main() { void (*p1_foo)() = foo; void (*p2_foo)() = *foo; void (*p3_foo)() = &foo; void (*p4_foo)() = *&foo; void (*p5_foo)() = &*foo; void (*p6_foo)() = **foo; void (*p7_foo)() = **********************foo; (*p1_foo)(); (*p2_foo)(); (*p3_foo)(); (*p4_foo)(); (*p5_foo)(); (*p6_foo)(); (*p7_foo)(); }
216 c++  c  function-pointers 

8
キャプチャラムダを関数ポインタとして渡す
関数ポインターとしてラムダ関数を渡すことは可能ですか?もしそうなら、私はコンパイルエラーを受け取っているので私は何かを間違ってしているに違いありません。 次の例を考えてみましょう using DecisionFn = bool(*)(); class Decide { public: Decide(DecisionFn dec) : _dec{dec} {} private: DecisionFn _dec; }; int main() { int x = 5; Decide greaterThanThree{ [x](){ return x > 3; } }; return 0; } これをコンパイルしようとすると、次のコンパイルエラーが発生します。 In function 'int main()': 17:31: error: the value of 'x' is …

13
Cはそれほど難しくありません:void(*(* f [])())()
今日は写真を見ただけで説明をいただければと思います。だからここに写真があります: 私はこれを混乱させ、そのようなコードがこれまでに実用的であるかどうか疑問に思いました。私は写真をグーグルで検索して、この redditエントリに別の写真を見つけました。ここにその写真があります。 それで、この「螺旋状に読む」は有効なものですか?これはCコンパイラの解析方法ですか? この奇妙なコードについて、より簡単な説明があればすばらしいでしょう。 すべてのほかに、これらの種類のコードは役に立ちますか?もしそうなら、いつ、どこで? 「スパイラルルール」についての質問がありますが、私はそれがどのように適用されるのか、またはそのルールで式がどのように読み取られるのかを尋ねているだけではありません。私はそのような表現の使用法とスパイラルルールの妥当性についても質問しています。これらについては、いくつかの良い答えがすでに投稿されています。

17
Javaのコールバック関数
Javaメソッドでコールバック関数を渡す方法はありますか? 私が模倣しようとしている動作は、関数に渡される.Net Delegateです。 別のオブジェクトを作成することを提案している人を見たことがありますが、それはやり過ぎのようですが、やり過ぎが唯一の方法であることは知っています。

6
1つのクラスのメンバー関数でジェネリックstd :: functionオブジェクトを使用する
1つのクラスについて、同じクラスのメンバー関数への関数ポインターを1つのmap格納std::functionオブジェクトに格納したい。しかし、私は最初にこのコードで失敗します: class Foo { public: void doSomething() {} void bindFunction() { // ERROR std::function<void(void)> f = &Foo::doSomething; } }; 私は受信error C2064: term does not evaluate to a function taking 0 argumentsにxxcallobjいくつかの奇妙なテンプレートのインスタンスエラーと組み合わせます。現在、Visual Studio 2010/2011を搭載したWindows 8で作業していますが、VS10を搭載したWin 7では失敗します。エラーは、私が従わないいくつかの奇妙なC ++ルールに基づいている必要があります


2
ループや条件付きステートメントなしで1から1000まで印刷するCコードはどのように機能しますか?
ループや条件なしで1から1000までCを出力するコードを見つけました。しかし、それがどのように機能するのかわかりません。誰かがコードを調べて各行を説明できますか? #include <stdio.h> #include <stdlib.h> void main(int j) { printf("%d\n", j); (&main + (&exit - &main)*(j/1000))(j+1); }

11
Javaの関数ポインター
これは一般的で些細なことかもしれませんが、具体的な答えを見つけるのに苦労しているようです。C#にはデリゲートの概念があり、これはC ++からの関数ポインターの概念に強く関連しています。Javaに同様の機能はありますか?ポインタがいくらか欠けていることを考えると、これについての最良の方法は何ですか?明確にするために、ここではファーストクラスについて話します。

14
C / C ++で関数ポインターとデータポインターに互換性がないのはなぜですか?
関数ポインターをデータポインターに変換したり、その逆を行ったりすると、ほとんどのプラットフォームで機能することを確認しましたが、機能するかどうかは保証されていません。これはなぜですか?どちらも単にメインメモリへのアドレスであってはならず、したがって互換性があるべきではないのですか

9
自由関数が期待される場所でメンバー関数を渡すにはどうすればよいですか?
問題は次のとおりです。このコードを検討してください。 #include <iostream> class aClass { public: void aTest(int a, int b) { printf("%d + %d = %d", a, b, a + b); } }; void function1(void (*function)(int, int)) { function(1, 1); } void test(int a,int b) { printf("%d - %d = %d", a , b , a - b); …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.