2011年07月12日

C++で関数内関数(inner function)をやってやるんだぜ。。。

C++って関数内関数(inner function)って作れないじゃないですか? でも、書きたい時あるよね?っで悪あがき。

1.関数内で構造体は定義できる


関数内で構造体は定義できるじゃないっすか。それを利用して、

int main(){
//構造体作ってその中で関数を定義する
struct{
void print_msg(const char *msg){
printf(msg);
}
}inner_func;

//構造体を通して関数を呼ぶ
inner_func.print_msg("inner_func!!!");

return 0;
}

問題点は、「構造体名、関数名」の二つを考えないと(記述しないと)いけないのが面倒。

2.C++ってoperatorあるじゃないですか


operatorを使って上記を書き換えると。

int main(){
//構造体作ってoperatorで関数を定義する
struct{
void operator()(const char *msg){
printf(msg);
}
}print_msg;

//operatorなので構造体インスタンス名で呼べる
print_msg("inner_func!!!");

return 0;
}

よし、関数名1個で済むようになったけど、関数内関数作りたいだけなのにstruct定義しててソース汚くない?構造体したいのか、関数内関数定義したいのか意図が読みづらいし。

3.よーし、defineに相談だ!


基本的には上記でやりたい事はできたのでdefineで化粧をする。スッピンじゃ人前に出れないし。

//関数内関数定義開始用define
#define def_start(ret,...) struct{ret operator()(__VA_ARGS__)
//関数内関数定義終了用define
#define def_end(func_name) }func_name

int main(){
def_start(void,const char *msg){
printf(msg);
}def_end(print_msg);

print_msg("inner_func!!!");

reutrn 0;
}

なんか関数っぽい!関数っぽい!っぽい!っぽい!

という分けで、C++でも関数内関数っぽい事ができますよっと。
※可変長引数のdefineはC99でしか通らないです。


ラベル:C++
posted by purigen at 10:00| Comment(0) | TrackBack(0) | C++ | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。