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

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

10
関数ポインターを介したC ++クラスメソッドの呼び出し
クラスメンバー関数の関数ポインターを取得し、後でそのメンバー関数を特定のオブジェクトで呼び出すにはどうすればよいですか?私は書きたいです: class Dog : Animal { Dog (); void bark (); } … Dog* pDog = new Dog (); BarkFunction pBark = &Dog::bark; (*pBark) (pDog); … また、可能であれば、ポインタを介してコンストラクタも呼び出したいです。 NewAnimalFunction pNew = &Dog::Dog; Animal* pAnimal = (*pNew)(); これは可能ですか?可能であれば、これを行うための好ましい方法は何ですか?

8
関数ポインターとしてのキャプチャーを備えたC ++ラムダ
私はC ++ラムダとそれらの関数ポインタへの暗黙の変換で遊んでいました。私の最初の例は、それらをftw関数のコールバックとして使用していました。これは期待どおりに機能します。 #include <ftw.h> #include <iostream> using namespace std; int main() { auto callback = [](const char *fpath, const struct stat *sb, int typeflag) -> int { cout << fpath << endl; return 0; }; int ret = ftw("/etc", callback, 1); return ret; } キャプチャを使用するように変更した後: int main() { vector<string> entries; …

7
メンバー関数への関数ポインター
同じクラス内の別の関数へのポインターであるクラスのメンバーとして関数ポインターを設定したいと思います。私がこれをしている理由は複雑です。 この例では、出力を「1」にします。 class A { public: int f(); int (*x)(); } int A::f() { return 1; } int main() { A a; a.x = a.f; printf("%d\n",a.x()) } しかし、これはコンパイルに失敗します。どうして?

4
int(*)(int *)= 5(または任意の整数値)の意味
私はこれを理解することはできません: int main() { int (*) (int *) = 5; return 0; } 上記の割り当ては、g ++ c ++ 11でコンパイルされます。それint (*) (int *)が(int *)引数として受け入れてintを返す関数へのポインタであることは知っていますが、それを5と同等にする方法がわかりません。最初は、常に5を返す関数だと思いました(最近の学習からF#、おそらくハハ)、それから私は簡単に、関数ポインタがメモリ位置5を指していると思いましたが、それは明らかに機能せず、16進値も機能しません。 関数がintを返すためである可能性があり、intの割り当ては(どういうわけか)大丈夫だと考えて、私もこれを試しました: int * (*) (int *) = my_ptr ここmy_ptrで、は型int *であり、int型の最初の場合と同様に、この2番目の関数ポインタと同じ型です。これはコンパイルされません。の代わりに5または任意のint値を割り当ててもmy_ptr、この関数ポインターに対してはコンパイルされません。 では、割り当てはどういう意味ですか? アップデート1 ベストアンサーに示されているように、これはバグであることが確認されています。ただし、関数ポインタに割り当てた値に実際に何が起こるのか、または割り当てで何が起こるのかはまだわかりません。それについての(良い)説明は大歓迎です!問題をより明確にするために、以下の編集を参照してください。 編集1 gccバージョン4.8.2(Ubuntu 4.8.2)を使用しています 編集2 実際、それを何かと同等にすることは私のコンパイラで機能します。std :: string変数、またはdoubleを返す関数名と同等でも機能します。 2.1を編集 興味深いことに、ポインタではないデータ型を返す関数への関数ポインタにすると、次のようにコンパイルできます。 std::string (*) () = 5.6; しかし、関数ポインタが何らかのポインタを返す関数を指すとすぐに、次のようにコンパイルされません。 …

7
関数ポインタを別の型にキャストする
void (*)(void*)コールバックとして使用する関数ポインターを受け入れる関数があるとしましょう。 void do_stuff(void (*callback_fp)(void*), void* callback_arg); さて、私がこのような関数を持っている場合: void my_callback_function(struct my_struct* arg); これを安全に行うことはできますか? do_stuff((void (*)(void*)) &my_callback_function, NULL); 私はこの質問を調べ、「互換性のある関数ポインター」にキャストできると言っているいくつかのC標準を調べましたが、「互換性のある関数ポインター」の意味の定義が見つかりません。

4
((void(*)())buf)();とは 平均?
私はpicoCTFでのバイナリの悪用の課題を解決しており、次のコードに遭遇しました。 ((void (*)())buf)(); どこbufの文字列です。 私は問題を解決しましたが、それが何をしているのか正確に理解できないようです。私はこのスレッドを見ましたが、理解できませんでした。 どういう((void (*)())buf)();意味ですか?

4
void * function()は関数へのポインターですか、それともvoid *を返す関数ですか?
の意味がわかりませんvoid *function()。 それは関数へのポインタvoid*ですか、それとも関数が戻りますか?私は常にポインタを返す再帰関数としてデータ構造で使用しましたが、マルチスレッド(pthread)でコードを見たとき、同じ関数宣言があります。今、私はそれらの違いが何であるか混乱しています。

2
ラムダマクロはどのようにラムダを作成しますか?
GitHubでこのコードを見つけましたが、よくわかりませんでした。 #define lambda(ret_type, _body) ({ ret_type _ _body _; }) 次に: int (*max)(int, int) = lambda(int, (int x, int y) { return x > y ? x : y; }); int max_value = max(1, 2); // max_value is 2 内部でアンダースコアは何をしていて、#defineどのようにして関数ポインタを返しますか?

1
オーバーロードされた関数ポインターとその引数を渡す際の不正な型の推定
std::invoke関数がオーバーロードされている場合でも、関数タイプを推定する作業を行うためのラッパーを提供しようとしています。 (私は昨日、可変およびメソッドポインターバージョンについて関連する質問をしました)。 関数に1つの引数がある場合、このコード(C ++ 17)は通常の過負荷状態で期待どおりに機能します。 #include <functional> template <typename ReturnType, typename ... Args> using FunctionType = ReturnType (*)(Args...); template <typename S, typename T> auto Invoke (FunctionType<S, T> func, T arg) { return std::invoke(func, arg); } template <typename S, typename T> auto Invoke (FunctionType<S, T&> func, T & arg) { return …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.