[✔️]cocos2dx luabinding代码,参数类型的推断

简介: [✔️]cocos2dx luabinding代码,参数类型的推断

模板的现有结果:


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_stringtools\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:静态重载函数


目录
相关文章
|
11月前
|
存储 编译器 Go
Go 语言内置类型全解析:从布尔到字符串的全维度探究
Go 语言内置类型全解析:从布尔到字符串的全维度探究
66 0
|
3月前
|
算法 程序员 C++
【C/C++ 泛型编程 应用篇】C++ 对多参数的参数包的 参数类型提取 应用
【C/C++ 泛型编程 应用篇】C++ 对多参数的参数包的 参数类型提取 应用
72 5
|
11月前
[Eigen中文文档] 编写以特征类型为参数的函数(一)
Eigen使用表达式模板的方式导致每个表达式的类型可能都不同。如果将这样的表达式传递给一个需要Matrix类型参数的函数,则表达式将隐式地被评估为一个临时Matrix,然后再传递给函数。这意味着失去了表达式模板的好处。
116 0
|
10月前
|
Go API
Go 语言怎么使用类型转换和类型断言?
Go 语言怎么使用类型转换和类型断言?
26 0
|
11月前
|
存储 编译器
[Eigen中文文档] 编写以特征类型为参数的函数(二)
Eigen使用表达式模板的方式导致每个表达式的类型可能都不同。如果将这样的表达式传递给一个需要Matrix类型参数的函数,则表达式将隐式地被评估为一个临时Matrix,然后再传递给函数。这意味着失去了表达式模板的好处。
71 0
|
C++
[✔️]c++返回2个值给lua,tolua如何处理c++函数重载
[✔️]c++返回2个值给lua,tolua如何处理c++函数重载
119 0
|
Python
Python学习:定义函数的默认参数和可变参数
定义函数的默认参数和可变参数
99 0
|
JavaScript
TypeScript 函数类型参数的用法举例
TypeScript 函数类型参数的用法举例
93 0
TypeScript 函数类型参数的用法举例
|
iOS开发
【iOS 开发】Objective - C 语法 之 类型转换
【iOS 开发】Objective - C 语法 之 类型转换
388 0
|
程序员 C语言 iOS开发
Objective-C中编写省略参数的多参函数
Objective-C中编写省略参数的多参函数
110 0