Sqplusで スクリプト側のクラスでstatic constを使えるようにする

2011/07/12のツイッターでつぶやいた

Sqplus 2.1.1 にアップ後、SQClassDefBaseに機能追加をしてみる。constantだけだとねぇ
 

にあった、ソースをちょっと説明してくれよ!とあったので、簡単に説明しよう。上の画像をみれば、分かる人には一瞬にして分かる(-.☆


まず、sqplus.hファイルのSQClassDefBaseの構造体の中に追加せよ。
// KAOKEN added [start]. http://www.kaoken.cg0.xyz	
// Register a static constant (read-only in script, passed by value (only INT, FLOAT, STRING, or BOOL types)).
template
<typename ConstantType>
SQClassDefBase & staticConstant(const ConstantType constant,const SQChar * name) {
	HSQUIRRELVM v = SquirrelVM::GetVMPtr();
	sq_pushobject(v,newClass.GetObjectHandle());
	sq_pushstring(v,name,-1);
	switch(TypeInfo<ConstantType>().TypeID) {
	case VAR_TYPE_INT: sq_pushinteger(v,constant);break;
	case VAR_TYPE_UINT: sq_pushinteger(v,(const int)constant);break;
	case VAR_TYPE_FLOAT: sq_pushfloat(v,constant);break;
	case VAR_TYPE_BOOL: sq_pushbool(v,constant);break;
	default:
		throw SquirrelError(_SC("staticConstant(): type must be INT, FLOAT, BOOL, or CONST CHAR *."));
	}
	sq_createslot(v,-3);
	sq_pop(v,1);
	return *this;
}
SQClassDefBase & staticConstant(const SQChar* constant,const SQChar * name) {
	HSQUIRRELVM v = SquirrelVM::GetVMPtr();
	sq_pushobject(v,newClass.GetObjectHandle());
	sq_pushstring(v,name,-1);
	sq_pushstring(v,constant,-1);
	sq_createslot(v,-3);
	sq_pop(v,1);
	return *this;
}
// KAOKEN added [end]. 


はぃ、これで使えるようになりました。簡単でしょ?

これで何ができるようになったんだい?と思った人もいるだろう。

 SqClassDef<hoge>(_T("hoge").constant(0,_T("TEST"));

をスクリプト側で呼び出した場合、

 print("hoge.TEST="+hoge.TEST);

エラーで怒られてしまいます。

 obj = hoge();
 print("obj.TEST="+obj.TEST);


これだとOKなんですよね。hogeで呼びたい時ってありますよね^^
それで、上記のソースを追加することによって、

 SqClassDef<hoge>(_T("hoge").staticConstant(0,_T("TEST"));

と書いて、 hoge.TESTが使えるようになるんですね。

それだけなんだけどね^^;

コメント 

コメントを残す