[✔️]c++返回2个值给lua,tolua如何处理c++函数重载

简介: [✔️]c++返回2个值给lua,tolua如何处理c++函数重载

项目中将部分的lua逻辑迁徙到c++,迁徙的过程中发现lua的function返回的是2个值,为了保证使用的统一性,也希望c++处理后,返回给lua的值数量保持不变。


cocos2dx 中返回2的情况



默认参数


  • binding


 if (argc == 1)
{
    cocos2d::Vec2 arg0;
    ok &= luaval_to_vec2(tolua_S, 2, &arg0, "cc.TMXLayer:getTileGIDAt");
    unsigned int ret = cobj->getTileGIDAt(arg0);
    tolua_pushnumber(tolua_S,(lua_Number)ret);
    tolua_pushnumber(tolua_S,(lua_Number)0);
    return 2;
}
if (argc == 2)
{
    cocos2d::Vec2 arg0;
    int arg1;
    ok &= luaval_to_vec2(tolua_S, 2, &arg0, "cc.TMXLayer:getTileGIDAt");
    ok &= luaval_to_int32(tolua_S, 3, &arg1, "cc.TMXLayer:getTileGIDAt");
    unsigned int ret = cobj->getTileGIDAt(arg0, (cocos2d::TMXTileFlags*)&arg1);
    tolua_pushnumber(tolua_S,(lua_Number)ret);
    tolua_pushnumber(tolua_S,(lua_Number)arg1);// 第二个参数
    return 2;
}


  • cpp


uint32_t TMXLayer::getTileGIDAt(const Vec2& pos, TMXTileFlags* flags/* = nullptr*/)


指针


  • binding


if (argc >= 0 && argc <= 2)
{
    float x = (float)  tolua_tonumber(tolua_S,2,0);
    float y = (float)  tolua_tonumber(tolua_S,3,0);
    self->getPosition(&x,&y);
    tolua_pushnumber(tolua_S,(lua_Number)x);
    tolua_pushnumber(tolua_S,(lua_Number)y);
    return 2;
}


  • cpp


void Node::getPosition(float* x, float* y) const
{
    *x = _position.x;
    *y = _position.y;
}


分析


返回多个值,写法有点特殊,有点怀疑是后期人为修改的


image.png


在lua模板文件中,也确实没有找到return 2的关键代码


image.png


至此,基本可以确认return 2的代码大部分都是后期人为修改的


tools\bindings-generator\targets\lua\conversions.yaml中也并没有关于return 2的相关模板配置


cocos2dx是如何处理c++函数重载


argc = lua_gettop(tolua_S)-1;
do 
{
    if (argc == 4)
    {
        cocos2d::Vec2 arg0;
        // 里面会进行类型的检查,如果失败,在debug模式就会主动报错,并返回false     
        ok &= luaval_to_vec2(tolua_S, 2, &arg0, "MapUtil:getRectDif_KeyGridIndex");
        if (!ok) { break; }
        int arg1;
        ok &= luaval_to_int32(tolua_S, 3,(int *)&arg1, "MapUtil:getRectDif_KeyGridIndex");
        if (!ok) { break; }
        cocos2d::Vec2 arg2;
        ok &= luaval_to_vec2(tolua_S, 4, &arg2, "MapUtil:getRectDif_KeyGridIndex");
        if (!ok) { break; }
        int arg3;
        ok &= luaval_to_int32(tolua_S, 5,(int *)&arg3, "MapUtil:getRectDif_KeyGridIndex");
        if (!ok) { break; }
        std::map<int, cocos2d::Vec2, std::less<int>, std::allocator<std::pair<const int, cocos2d::Vec2> > > ret = MapUtil::getRectDif_KeyGridIndex(arg0, arg1, arg2, arg3);
        std_map_int_vec2_to_luaval(tolua_S, ret);
        return 1;
    }
} while (0);
// 如果以上类型转换失败,还有会进行下边的类型转换
ok  = true;
do 
{
    if (argc == 4)
    {
        int arg0;
        ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "MapUtil:getRectDif_KeyGridIndex");
        if (!ok) { break; }
        int arg1;
        ok &= luaval_to_int32(tolua_S, 3,(int *)&arg1, "MapUtil:getRectDif_KeyGridIndex");
        if (!ok) { break; }
        int arg2;
        ok &= luaval_to_int32(tolua_S, 4,(int *)&arg2, "MapUtil:getRectDif_KeyGridIndex");
        if (!ok) { break; }
        int arg3;
        ok &= luaval_to_int32(tolua_S, 5,(int *)&arg3, "MapUtil:getRectDif_KeyGridIndex");
        if (!ok) { break; }
        std::map<int, cocos2d::Vec2, std::less<int>, std::allocator<std::pair<const int, cocos2d::Vec2> > > ret = MapUtil::getRectDif_KeyGridIndex(arg0, arg1, arg2, arg3);
        std_map_int_vec2_to_luaval(tolua_S, ret);
        return 1;
    }
} while (0);
ok  = true;
luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d", "MapUtil:getRectDif_KeyGridIndex",argc, 4);
return 0;


目录
相关文章
|
24天前
|
程序员 C++
C++中的函数重载有什么作用
【10月更文挑战第19天】C++中的函数重载有什么作用
17 3
|
5月前
|
编译器 C++
C++进阶之路:何为命名空间、缺省参数与函数重载
C++进阶之路:何为命名空间、缺省参数与函数重载
38 3
|
24天前
|
编译器 程序员 C++
C++中的函数重载是什么
【10月更文挑战第19天】C++中的函数重载是什么
20 0
|
6月前
|
存储 安全 编译器
【C++入门】缺省参数、函数重载与引用(下)
【C++入门】缺省参数、函数重载与引用
|
1月前
|
自然语言处理 编译器 Linux
【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器
【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器
|
1月前
|
程序员 C++ 开发者
C++入门教程:掌握函数重载、引用与内联函数的概念
通过上述介绍和实例,我们可以看到,函数重载提供了多态性;引用提高了函数调用的效率和便捷性;内联函数则在保证代码清晰的同时,提高了程序的运行效率。掌握这些概念,对于初学者来说是非常重要的,它们是提升C++编程技能的基石。
21 0
|
3月前
|
编译器 程序员 C语言
C++函数重载
在实际开发中,有时候我们需要实现几个功能类似的函数,只是有些细节不同。例如希望交换两个变量的值,这两个变量有多种类型,可以是 int、float、char、bool 等,我们需要通过参数把变量的地址传入函数内部。在C语言中,程序员往往需要分别设计出三个不同名的函数,其函数原型与下面类似: void swap1(int *a, int *b); //交换 int 变量的值 void swap2(float *a, float *b); //交换 float 变量的值 void swap3(char *a, char *b); //交换 char 变量的
C++函数重载
|
3月前
|
编译器 Linux C语言
【C++小知识】为什么C语言不支持函数重载,而C++支持
【C++小知识】为什么C语言不支持函数重载,而C++支持
|
3月前
|
安全 编译器 C++
C++入门 | 函数重载、引用、内联函数
C++入门 | 函数重载、引用、内联函数
32 5
|
4月前
|
存储 自然语言处理 编译器
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用