|
Borland C/C++中的__closure关键字,可以让一个函数指针能够指向任意一个,包括未知类的非静态成员函数。
前些日子,我曾经公布了Microsoft C/C++ (Visual C/C++)下的解决办法。
现在,在天使脚本引擎中的这一处理也已实现。
天使脚本引擎中
脚本类成员函数(简称SMF)可以映射为真实C函数(CF)或真实C++类非静态成员函数(CMF)。
而一个普通的脚本C函数(SF)仅能映射真实C函数(CF),不能映射到C++非静态成员函数(CMF)。
而现今的程序设计中大量使用到类,如果脚本引擎中的普通C函数仅能映射C函数,会让编程变得极为麻烦。反之如果可以映射非静态C++类成员函数,那将极大的简化我们的程序设计。
于是,再次动用汇编之力修改天使脚本引擎。支持了这一完全不符合C++标准的设计。
- #include<hgl/hgl.h>
- #include<hgl/AngelVM.H>
- #include<stdio.h>
- //
- using namespace hgl;
- //
- int value = 0;
- //
- int test_func(int a)
- {
- return 128+a;
- }
- //
- class TestObject:public _Object
- {
- public:
- int func(int a)
- {
- return 64+a;
- }
- };
- //
- char script[]=
- {
- "void main() \n"
- "{ \n"
- " int a=256; \n"
- " test_value=a+func(15); \n"
- " test_value+=cpp_func(0);\n"
- "} \n"
- };
- //
- void GameMain(wchar_t *)
- {
- AngelVM vm; //定义虚拟机
- AngelVM::Module *module;
- //
- TestObject *to=new TestObject;
- //
- vm.MapProperty("int test_value",&value); //设定变量映射
- vm.MapFunc("int func(int)",test_func); //设定C函数映射,调用test_func
- [color=#FF0000]vm.MapCppFunc("int cpp_func(int)",to,TestObject::func); //设定C++函数映射,调用to->func[/color]
- //
- module=vm.CreateModule("test"); //创建模块
- //
- module->AddScript("main",script); //添加脚本
- // //脚本可多次添加,最在最后再调用Build
- //
- module->Build(); //编译脚本
- //
- module->RunScript("test_value=func(25);"); //运行指定文本,让脚本调用真实程序中的函数
- //
- printf("value=%d\n",value); //输出结果
- //
- module->RunFunc("void main()"); //运行指定的函数,调用脚本中的函数
- //
- printf("value=%d\n",value); //输出结果
- //
- delete to;
- }
复制代码 |
|