模板的现有结果:
if (argc == ${arg_idx}) { #set $count = 0 #while $count < $arg_idx #set $arg = $arguments[$count] ## 参数声明 ${arg.to_string($generator)} arg${count}; #set $count = $count + 1 #end while #set $count = 0 #set arg_list = "" #set arg_array = [] #while $count < $arg_idx #set $arg = $arguments[$count] ## ... ## 单个参数的拼接 #set $arg_array += ["arg"+str(count)] #end while ## 函数的所有参数是通过join拼接出来的字符串 #set $arg_list = ", ".join($arg_array) ## 函数调用的地方
最终生成的c++代码
if (argc == 3) { cocos2d::Vec2 arg0; bool arg1; cocos2d::Vec2* arg2; // 我先修改这里的类型,不适用指针 cocos2d::Vec2 ret = Map::Pixel(arg0, arg1, arg2); // arg2的参数类型不符合预期,也需要改为&
优化指针类型
arg.to_string
在tools\bindings-generator\generator.py
中有定义
里面会返回变量的类型,如果类型是指针也会原封不动的返回,所以也就看到了cocos2d::Vec2*
,那么我们只需要修改下arg.to_string
的实现就行了,可以根据self.is_pointer进行判断处理变量的类型
改完后,在调用的地方需要正确传参,预期的结果应该是:
cocos2d::Vec2 arg2; cocos2d::Vec2 ret = Map::Pixel(arg0, arg1, &arg2);
args2
要正确替换为&arg2
,经过上边的分析,我们发现只需要在拼接单个参数的地方修改下即可,如果参数是指针类型,入参加上&
即可,类似这样
#set $arg_array += [arg.to_prefix()+"arg"+str(count)]
在python中加上对应的函数:
def to_prefix(self) if self.is_pointer: return "&" else: return ""
具体的修改,参考这次:pr
函数指针参数的意义
目前这样就能达到预期的进行函数调用了
cocos2d::Vec2 arg2; cocos2d::Vec2 ret = Map::Pixel(arg0, arg1, &arg2);
不过这样的调用其实没有什么意义,arg2是一个临时变量,使用完毕就抛弃了,其实我把参数声明为指针,是希望函数修改后,供外部使用,返回给lua才有意义,如果仅仅作为参数,其实是没有必要声明为指针的。
返回给lua多个值,目前模板不支持,需要后续慢慢再进行优化。
相关的模板代码
- ifunction.c:成员函数
- ifunction_overloaded.c:成员函数重载
- sfunction.c: 静态函数
- sfunction_overloaded.c:静态重载函数