Lua
- 仕事で使ってるLuaが便利すぎる件について
相変わらずすげー便利なのですが、スクリプトから呼び出す関数の登録が中々綺麗に書けない。
ファクトリメソッドに登録するときに上手い具合にクラス毎のスクリプト登録処理が呼べないかと思ったが、スクリプト登録関数なんてのは最初の1回でしかもクラスのインスタンス無しで登録するものなんで、staticにしかしようが無いんですよね。
でC++の仕様でstaticな関数はvirtualに出来ないというのがあるんだけど、
class base { public: static virtual void foo() { printf("foo\n"); } }; class a : public base { public: static void foo() { printf("a\n"); } }; class b : public base { public: }; int main() { a::foo(); b::foo(); }
ってやった時にb::foo()を呼び出すとbase::foo()が呼ばれる仕組みだといいなぁとか思ったんですが、
確かにインスタンスが無いのに基底クラスの関数が呼ばれるのはなんとなく不気味だよなぁ。
でも出来てもいいと思うんだけどなぁ。
ちなみにVCでテストしたら駄目でした。
これができれば
class a : public base { public: static virtual void RegisterScriptFunction(); }; void a::RegisterScriptFunction() { // 関数をluaに登録する }
とかやってRegisterScriptFunctionをコールバック関数として登録して、こいつが無い奴でも
基底クラスのRegisterScriptFunctionが呼ばれるとかだと記述が楽なんだけどなぁ。
結局できないので、全派生クラスにstatic関数を追加するという暴挙に出ました。
何か上手い方法は無いものか。
virtualをはずしてみたら普通にうまく行った。
基底クラスにキャストされたインスタンスとかそういうのがないから別にvirtualじゃなくてもいいのか。
最初の奴をvirtual外すだけで期待通りの挙動をします。
後は登録するときにテンプレート関数を使えばうまくいくな。
class base { public: static void foo() { printf("foo\n"); } }; class a : public base { public: static void foo() { printf("a\n"); } }; class b : public base { public: }; template <class T> void TRegist() { T::foo(); } int _tmain(int argc, _TCHAR* argv[]) { a::foo(); b::foo(); void (*pfunc)() = TRegist<a>; pfunc(); pfunc = TRegist<b>; pfunc(); return 0; }
a foo a foo
チリバツ!