PHP のようなインタプリタ言語では、ソースコードの動的読み込みやメソッドの動的追加など、プログラムを拡張するポイントを簡単に作ることができますが、コンパイル言語である C++ ではそうはいきません。やろうとするとコールバック関数などを考えると思うのですが、それだと関数ひとつしか登録できません。
もし、何かのイベントが発生した際にあらかじめ設定しておいた関数を複数呼び出したい場合は C# のデリゲータに近い構造にする必要があります。デリゲータはコールバックと発想は似ていますが、複数の関数を登録できる点で異なっています。コールバック関数でも目的は達成できるのですが、コールバック関数の場合は自分が所有するオブジェクトしか扱うことができません。その点でデリゲータに優位性があります。
私はこれを「言語の機能だから」と C++ ではあきらめていたのですが、冷静に考えてみると関数へのポインタを配列で持っておけばできそうですね。実際に XOOPS Cube ではそれに近い実装で実現しています(もっとも、 XOOPS Cube は元々スクリプト言語ですので、それ自体に拡張性があるわけですが)。
問題はインタフェースを完璧に決めておかないといけないということですが、そこら辺はがんばって調整したいと思います。というか、それが嫌ならコンパイル言語は使えないと思います。
着実に同人ゲーム開発への道を進んでおります。
Contributions