stackoverflow で質問を読んで、自分自身へのポインターを取る関数を宣言できるかどうか疑問に思いました。つまり、次のように を宣言するfoo
と、次のようになります。
foo(foo);
最も単純なアイデアは、別の関数ポインターにキャストすることです (void*
小さい可能性があるため、 にキャストすることはできません)。したがって、関数宣言は次のようになります。
void foo(void (*)());
それは C では問題ありませんが (C++ でのキャストでも機能します)、そのようなハードな「再解釈」キャストや型情報の損失なしに実行できるかどうか疑問に思います。
つまり、次の宣言が必要です。
void foo( void (*)( void (*)( void (*) ( ... ))));
しかしもちろん、無制限の宣言は不可能です。ナイーブtypedef
も役に立ちません。
foo(foo)
C++ テンプレートは、呼び出しコード ( ) が少し簡潔に見えなくても歓迎されますが、それでも有限です。
キャストせずに型情報を削除する方法、またはそのような他のトリックを示すCスタイルの回答は、もちろん興味深いですが、受け入れられません。