这是一个几年前写的对lua的访问封装,当时的项目仅提供了最基本的lua访问接口:调用lua函数,向lua注册标准格式的C++函数.

本来我想引进luabind,但luabind相对又过于复杂,并不是所有功能都是我需要的,并且还要为此引入庞大boost.最终还是决定

按需求编写一个简单的封装库.

首先简单列一下我的需求:

1)可以注册任意类型的C++函数到lua中

2)可以方便的调用lua函数,方便的访问lua中的表

3)可以访问lua中创建的对象,调用lua对象提供的方法

4)注册C++类型到lua,使lua可以访问C++对象的字段,和函数

下面介绍一下提供的一些API:

1)call_luaFunction,用于方便的调用lua函数,使用格式如下:

int ret = call_luaFunction<int>("funname",L);

2)register_function,用于向lua注册任意类型的C++函数,例如有如下函数:

static int showmsg(const char *msg)

{

  printf("%s\n",msg);

  return 0;

}

则可以这样注册,register_function(L,"show",showmsg);

3)register_class,register_property,register_member_function用于向lua注册一个C++类型

4)luaObject,代表lua中的对象,可以通过成员函数CallMemberFunction,SetMemberValue,GetMemberValue

访问lua对象的方法和成员变量

5)luatable,代表lua中的表

6)Interger64用以支持在lua中实现64位整型运算

这里说明一下,我不想C++对象在lua中被创建,而只能在C++中创建再传递给lua(Interger64是个例外,因为它主要是在lua中被使用的类型),所以register_class

并没有提供构造函数的注册.

测试代码:

 #include "luaWrapper.h"
#include <stdio.h> static int userdata(lua_State *L)
{
int *a = (int*)lua_touserdata(L,-);
printf("a = %d\n",*a);
return ;
}
static int showmsg(const char *msg)
{
printf("%s\n",msg);
return ;
} class testa
{
public:
int vala;
int valb[];
}; class testd
{
public:
virtual void testdf(){}
int vald;
}; class testb : virtual public testa,virtual public testd
{
public: virtual void function()
{
printf("this is function\n");
} int64_t valb;
double vald;
}; class testc : public testb
{
public:
void function()
{
printf("this is testc\n");
} void functionc()
{
printf("functionc\n");
}
}; int main()
{
luaWrapper lw;
lw.init();
lw.load("start.lua");
lua_State *L = *(&lw);
//测试注册任意C++函数
register_function(L,"show",showmsg); //测试向lua注册C++类
register_class<testb>(L,"testb");
register_property("valb",&testb::valb);
register_property("vald",&testb::vald);
register_member_function("func",&testb::function); register_class<testc,testb>(L,"testc");
register_member_function("funcc",&testc::functionc); testc tc;
tc.valb = ;
tc.vald = 10.0f;
testb tb;
tb.valb = ;
call_luaFunction<void>("test1",L,&tc,(int64_t));
printf("%lld\n",tc.valb);
printf("%f\n",tc.vald); luatable ret = call_luaFunction<luatable>("test2",L);
int i=;
printf("{");
for(;i<ret.size();++i)
{
printf("%d,",any_cast<int>(ret[i]));
}
printf("}\n"); lua_results<> ret1 = call_luaFunction<lua_results<>>("test4",L);
printf("{");
for(i=;i<ret1._rets.size();++i)
{
printf("%d,",any_cast<int>(ret1._rets[i]));
}
printf("}\n"); luaObject ac = call_luaFunction<luaObject>("test3",L);
ac.CallMemberFunction<void>("show");
printf("balance:%d\n",ac.GetMemberValue<int>("balance"));
ac.SetMemberValue<int>("balance",);
printf("balance:%d\n",ac.GetMemberValue<int>("balance"));
luatable lt_in;
for(int i = ; i < ;++i)
lt_in.push_back(i);
call_luaFunction<void>("test5",L,lt_in); call_luaFunction<void>("test6",L,"this is string"); lt_in.clear();
lt_in.push_back((const char*)"hello1");
lt_in.push_back((const char*)"hello2");
lt_in.push_back((const char*)"hello3");
lt_in.push_back((const char*)"hello4");
lt_in.push_back((const char*)"hello5");
call_luaFunction<void>("test5",L,lt_in);
getchar();
return ;
}
 Account = {
balance = ,
names=,
} function Account:withdraw (v)
self.balance = self.balance - v
end function Account:new (o)
o = o or {}
setmetatable(o, self)
self.__index = self
return o
end function Account:show()
print("this is account show")
end function Account:getBalance()
return self.balance
end function Account:setBalance(val)
self.balance = val
end function t(tb)
tb:func()
end function test1(tb,i)
t(tb)
show("hello world")
print(tb.valb)
tb.valb = i64:new()
tb.vald = 1000.2
print(i)
end function test2()
return {,,,,}
end function test3()
account = Account:new();
account.balance =
account.name = "sniperHW"
return account
end function test4()
return ,,,,
end function test5(lt)
print(lt[])
print(lt[])
print(lt[])
print(lt[])
print(lt[])
end function test6(str)
print(str)
end

C++实现对lua访问的封装的更多相关文章

  1. 利用过滤器Filter和特性Attribute实现对Web API返回结果的封装和统一异常处理

    在我们开发Web API应用的时候,我们可以借鉴ABP框架的过滤器Filter和特性Attribute的应用,实现对Web API返回结果的封装和统一异常处理,本篇随笔介绍利用AuthorizeAtt ...

  2. Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问

    本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这 ...

  3. 使用JWT来实现对API的授权访问

    目录 什么是JWT JWT的结构 Header Payload Signature 解码后的JWT JWT是怎样工作的 在JAVA里使用JWT 引入依赖 JWT Service 生成JWT 解码JWT ...

  4. 一个简单的QQ隐藏图生成算法 通过jQuery和C#分别实现对.NET Core Web Api的访问以及文件上传

    一个简单的QQ隐藏图生成算法   隐藏图不是什么新鲜的东西,具体表现在大部分社交软件中,预览图看到的是一张图,而点开后看到的又是另一张图.虽然很早就看到过这类图片,但是一直没有仔细研究过它的原理,今天 ...

  5. SILVERLIGHT实现对HTML DOM的访问

    实现对HTML DOM的访问.Silverlight 2在命名空间System.Windows.Browser下内置了很多对于HTML DOM访问和操作的支持,我们最常用的一个对象是HtmlEleme ...

  6. 利用 Java 操作 Jenkins API 实现对 Jenkins 的控制详解

    本文转载自利用 Java 操作 Jenkins API 实现对 Jenkins 的控制详解 导语 由于最近工作需要利用 Jenkins 远程 API 操作 Jenkins 来完成一些列操作,就抽空研究 ...

  7. struts2视频学习笔记 22-23(基于XML配置方式实现对action的所有方法及部分方法进行校验)

    课时22 基于XML配置方式实现对action的所有方法进行校验   使用基于XML配置方式实现输入校验时,Action也需要继承ActionSupport,并且提供校验文件,校验文件和action类 ...

  8. 在应用程序中实现对NandFlash的操作

    以TC58NVG2S3ETA00 为例: 下面是它的一些物理参数: 图一 图二 图三 图四 图五 图6-0 图6-1 说明一下,在图6-1中中间的那个布局表可以看做是实际的NandFlash一页数据的 ...

  9. c#调用js,以及js调用C#里的函数, c#自己生成js代码,实现对web的控制

    using mshtml;using System;using System.Collections.Generic;using System.Linq;using System.Security.P ...

随机推荐

  1. C++ 之const Member Functions

    Extraction from C++ primer 5th Edition 7.1.2 The purpose of the const that follows the parameter lis ...

  2. HDU 1166 敌兵布阵(线段树模板题)

    题目链接: 传送门 敌兵布阵 Time Limit: 2000MS     Memory Limit: 32768 K Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头 ...

  3. sql附加数据库错误5120

    http://zhidao.baidu.com/link?url=p1o8EjUhn-RYFt1D4uIM-5HQF1oXZIRlPGaDiZ2FRMDzZDG1ooSARfkoPWG6SzTJTN6 ...

  4. asp.net mvc @Html.Raw 作用

    转自:http://zhidao.baidu.com/link?url=unayXHAylQiUF0E3Rc9ej4gz_XBC7sbwInupVFuDnp_Cuqdz5NzMyUK5u-HiSfif ...

  5. javascript 字符串加密的几种方法

    8进制 /*8进制加密*/ function EnEight(){ var monyer = new Array();var i,s; for(i=0;i<txt.value.length;i+ ...

  6. linux安装pip

    1.先说一下什么是pippip 是"A tool for installing and managing Python packages.",也就是说pip是python的软件安装 ...

  7. MyISAM 和InnoDB 区别 转

    MyISAM 和InnoDB 讲解 InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处理 ...

  8. 自然语言21_Wordnet

    QQ:231469242 欢迎喜欢nltk朋友交流   http://baike.baidu.com/link?url=YFVbJFMkZO9A5CAvtCoKbI609HxXXSFd8flFG_Lg ...

  9. 在Nginx服务器中设置多个站点

    这里以配置1个站点(1个域名)为例,n 个站点可以相应增加调整, 假设:IP地址: 127.0.0.1域名1 phpmyadmin.zhengwen.cn 放在 /www/phpmyadmin.zhe ...

  10. Node.js Tools 1.2 for Visual Studio 2015 released

    https://blogs.msdn.microsoft.com/visualstudio/2016/07/28/node-js-tools-1-2-visual-studio-2015/ What ...