C++实现对lua访问的封装
这是一个几年前写的对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;
}
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访问的封装的更多相关文章
- 利用过滤器Filter和特性Attribute实现对Web API返回结果的封装和统一异常处理
在我们开发Web API应用的时候,我们可以借鉴ABP框架的过滤器Filter和特性Attribute的应用,实现对Web API返回结果的封装和统一异常处理,本篇随笔介绍利用AuthorizeAtt ...
- Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问
本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这 ...
- 使用JWT来实现对API的授权访问
目录 什么是JWT JWT的结构 Header Payload Signature 解码后的JWT JWT是怎样工作的 在JAVA里使用JWT 引入依赖 JWT Service 生成JWT 解码JWT ...
- 一个简单的QQ隐藏图生成算法 通过jQuery和C#分别实现对.NET Core Web Api的访问以及文件上传
一个简单的QQ隐藏图生成算法 隐藏图不是什么新鲜的东西,具体表现在大部分社交软件中,预览图看到的是一张图,而点开后看到的又是另一张图.虽然很早就看到过这类图片,但是一直没有仔细研究过它的原理,今天 ...
- SILVERLIGHT实现对HTML DOM的访问
实现对HTML DOM的访问.Silverlight 2在命名空间System.Windows.Browser下内置了很多对于HTML DOM访问和操作的支持,我们最常用的一个对象是HtmlEleme ...
- 利用 Java 操作 Jenkins API 实现对 Jenkins 的控制详解
本文转载自利用 Java 操作 Jenkins API 实现对 Jenkins 的控制详解 导语 由于最近工作需要利用 Jenkins 远程 API 操作 Jenkins 来完成一些列操作,就抽空研究 ...
- struts2视频学习笔记 22-23(基于XML配置方式实现对action的所有方法及部分方法进行校验)
课时22 基于XML配置方式实现对action的所有方法进行校验 使用基于XML配置方式实现输入校验时,Action也需要继承ActionSupport,并且提供校验文件,校验文件和action类 ...
- 在应用程序中实现对NandFlash的操作
以TC58NVG2S3ETA00 为例: 下面是它的一些物理参数: 图一 图二 图三 图四 图五 图6-0 图6-1 说明一下,在图6-1中中间的那个布局表可以看做是实际的NandFlash一页数据的 ...
- c#调用js,以及js调用C#里的函数, c#自己生成js代码,实现对web的控制
using mshtml;using System;using System.Collections.Generic;using System.Linq;using System.Security.P ...
随机推荐
- django1.8 提示(1_8.W001) The standalone TEMPLATE_* settings were deprecated in Django 1.8 and the TEMPLATES dictionary takes precedence. You must put the values of the following settings into your defau
原因是升级之后不推荐使用单独的 TEMPLATES_DIR这样的设置了,使用TEMPLATE = []这种就好了 详细见https://openedx.atlassian.net/browse/TNL ...
- WINDBUG常用命令
配置: File->Symbol path-> SRV*C:\symbols*http://msdl.microsoft.com/download/symbols 载入sos.dll 执 ...
- python运维开发之路02
年底事多,在公司忙成狗,难得把博客更新了下 本章主要内容是collections模块的介绍(队列,计数器,默认字典,有序字典,可命名元组,以及简单介绍深浅拷贝!) collections模块 coll ...
- SQL查询效率:100w数据查询只需要1秒钟
G os: windows 数据库: ms sql server 目的: 查询性能测试,比较两种查询的性能 SQL查询效率 step by step -- setp . -- 建表 create ta ...
- CentOS7搭建hadoop2.6.4双节点集群
环境: CentOS7+SunJDK1.8@VMware12. NameNode虚拟机节点主机名:master,IP规划:192.168.23.101,职责:Name node,Secondary n ...
- Python MySQLdb在Linux下的快速安装
在家里windows环境下搞了一次 见 python MySQLdb在windows环境下的快速安装.问题解决方式 http://blog.csdn.NET/wklken/article/deta ...
- Eclipse中修改Web项目的URL访问路径
背景 访问路径,也就是指在浏览器中访问该web系统时的根路径,比如http://localhost:8080/xxxx/index.jsp 这里的xxxx,也就是request.getContext ...
- php ceil() 函数向上舍入为最接近的整数。
代码: <?php echo(ceil(0.60); echo(ceil(0.40); echo(ceil(); echo(ceil(5.1); echo(ceil(-5.1); echo(ce ...
- Bitcask 存储模型
Bitcask 存储模型 Bitcask 是一个日志型.基于hash表结构的key-value存储模型,以Bitcask为存储模型的K-V系统有 Riak和 beansdb新版本. 日志型数据存储 何 ...
- 四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)
众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml- ...