• ベストアンサー

関数の戻り値にその関数のポインタを返すには?

関数ポインタの使い方について質問したいです. 関数で,自分自身のポインタを(void*)ではなく関数と同じ型のポインタで返すことは可能でしょうか? (自分自身の関数ポインタと同じ型??) fucn (){ return fucn; } int main(){ fucn()()()(); return 0; } このようにmain関数の中でfucn()()・・・ のように任意個の()を書いたりできないでしょうか?  詳しい方いたらよろしくお願いします.

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

有名なネタで, C では不可能です. 別途構造体なり共用体なりを定義してそいつを経由するか, あるいはキャストを使うことになります. ただし, void * にキャストするのは危険な気がします. まだしも typedef void (*PF)(); typedef PF (*FUNC)(); PF func() { return (PF)func; } void foo() { ((FUNC)func())(); } の方が安全だと思う. C++ でも直接には不可能ですが, こっちだと operator() のオーバーロードができるのでなんとでもなる. 例えば class FUNC { public: FUNC(FUNC (*pf)()) : f(pf) { } FUNC operator ()() const { return f(); } private: FUNC (*f)(); }; FUNC func() { return func; } void foo() { func()()()(); } とか.

sorokuku
質問者

お礼

回答ありがとうございます. 有名なネタでしたか なるほど,確かにC++のオペレーター等を使えれば似たものを作れそうですね. いろいろ実験してみます.ありがとうございました.

その他の回答 (2)

回答No.2

>同じように()をいくつもつけられないだろうかと思いまして. きちんと戻り値の型を指定すればいくつでもできますよ。 #include <stdio.h> void Do() { printf("Do\n"); } void (*AAA())() { return Do; } void (*(*BBB())())() { return AAA; } void (*(*(*CCC())())())() { return BBB; } void (*(*(*(*DDD())())())())() { return CCC; } int main(void) {   DDD()()()()();   return 0; } typedefしないと括弧が大変なことになりますが。 まぁ、そんな関数を必要としたことはいままでなかったですけど。 (C言語のみの場合はありうるかも。C++なら関数ポインタ自体あまり使わないからなぁ。)

sorokuku
質問者

お礼

回答ありがとうございます. 確かに,実際には必要になりそうにないですね・・・ void (*(*(*(*DDD())())())())() { return CCC; } このような表現が可能であることが驚きました.

回答No.1

> 自分自身の関数ポインタと同じ型 はどうしても定義できないのでは? 関数の型を FUNC としたときFUNCを返す関数事態の型が FUNC (*)() → typedef FUNC (*HOGE)(); とする となるので、FUNC = HOGE にはできません。 (void*で返してキャストするしかないかなぁ。 typedef void* (*FUNC)(); void* func() { return func; } int main(void) { (*(FUNC)func())(); return 0; } ) そもそもなんでそんなことをやりたいのでしょうか?

sorokuku
質問者

お礼

早速のご回答ありがとうございます. やっぱりできなさそうですね・・・ 関数ポインタをfucn()()のように扱っているのを見たのですが, 同じように()をいくつもつけられないだろうかと思いまして. 実際のところ,何かに必要というわけではありません...

関連するQ&A