戦うアプリニート

cocos2d-xやRuby on Railsの備忘録

cocos2d-x v3 (というかc++) 関数ポインタのテーブルを作って、for文で「れんぞくま」する

参考にさせてもらった記事です。

メンバ関数のテーブル化

ぶっちゃけ私の理解度は低いので、正確な記述・理解を求める方は上記リンクへGO!
ただ、「こんなこともできるんか!」と感動してしまったので、記録に残しておくことにします。


例えばメソッドが5つあったとして。

// HelloWorld.cppとか

void HelloWorld::Firaga() //ファイガ
{
}

void HelloWorld::blizzaga() //ブリザガ
{
}

void HelloWorld::thundaga() //サンダガ
{
}

void HelloWorld::meteor() //メテオ
{
}

void HelloWorld::artema() //アルテマ
{
}


これを関数ポインタのテーブルMagicMenuにしちゃいます。

//これも同じHelloWorld.cpp内

void(HelloWorld::* MagicMenu[])()
{
    &HelloWorld::firaga,
    &HelloWorld::blizzaga,
    &HelloWorld::thundaga,
    &HelloWorld::meteor,
    &HelloWorld::artema
};


ほいでもって、こうだ!

// HelloWorld.cpp

for (int i = 0; i < 5; i ++)
{
        (this->*MagicMenu[i])(); // ファイガ! ブリザガ! サンダガ! メテオにアルテマ!
}

ほぼワンライナーで乱れ打ちが可能であります。
これはちょっと感動的。プログラムってスゲー!


ただ、privateメソッドの場合など、
「ようやくc++で簡単なプログラムを組めるようになってきた」
くらいの雑魚(私です)には、大変にとっつきにくい構文であります。
これを継承して、とか考えるだけで頭が痛くなりそうです。

でも、ここで挙げたサンプル程度の使い方でも、
「他クラスから順番に呼び出したいメソッドが大量にある」場合など、
コードを書く量は激減するはず。

それにウィザード気分が味わえるので、なかなか楽しいのではないでしょうか。


関数ポインタのテーブルのサンプルでした。