アプリ版:「スタンプのみでお礼する」機能のリリースについて

関数ポインタの使い方について質問したいです.
関数で,自分自身のポインタを(void*)ではなく関数と同じ型のポインタで返すことは可能でしょうか?

(自分自身の関数ポインタと同じ型??) fucn (){
return fucn;
}

int main(){
fucn()()()();

return 0;
}

このようにmain関数の中でfucn()()・・・
のように任意個の()を書いたりできないでしょうか? 
詳しい方いたらよろしくお願いします.

A 回答 (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()()()();
}
とか.
    • good
    • 0
この回答へのお礼

回答ありがとうございます.
有名なネタでしたか

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

お礼日時:2009/06/23 15:58

>同じように()をいくつもつけられないだろうかと思いまして.


きちんと戻り値の型を指定すればいくつでもできますよ。

#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++なら関数ポインタ自体あまり使わないからなぁ。)
    • good
    • 0
この回答へのお礼

回答ありがとうございます.

確かに,実際には必要になりそうにないですね・・・

void (*(*(*(*DDD())())())())() { return CCC; }
このような表現が可能であることが驚きました.

お礼日時:2009/06/23 15:51

> 自分自身の関数ポインタと同じ型


はどうしても定義できないのでは?

関数の型を FUNC
としたときFUNCを返す関数事態の型が

FUNC (*)() → typedef FUNC (*HOGE)(); とする

となるので、FUNC = HOGE にはできません。
(void*で返してキャストするしかないかなぁ。
typedef void* (*FUNC)();
void* func() { return func; }
int main(void) { (*(FUNC)func())(); return 0; }
)



そもそもなんでそんなことをやりたいのでしょうか?
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます.
やっぱりできなさそうですね・・・

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

お礼日時:2009/06/23 13:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!