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 ...
随机推荐
- UOJ #10 pyx的难题
pyx的难题 被这题搞得生无可恋. 容易看出 题目完成时间与优先级之间的关系是单调的,故可以二分答案. 用于二分的答案可以取\(O(n)\)个离散值, 这样就很方便地保证了优先级各不相同. 可以用优先 ...
- 演示get、post请求如何算sn,算得sn如何使用
import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.UnsupportedEncoding ...
- 【Alpha版本】冲刺-Day3
队伍:606notconnected 会议时间:11月11日 会议总结 张斯巍(433) 今天安排:个人信息界面设计 完成度:100% 明天计划:个人信息界面设计 遇到的问题:ps掌握的还不够熟练,导 ...
- 《Linux菜鸟入门2》Ldap
ldap网络帐号1.ldap是什么ldap目录服务认证,和windows活动目录类似,就是记录数据的一种方式 2.ldap客户端所需软件yum install sssd krb-workstation ...
- 一文彻底了解join的各种用法
表a 表b a1 a2 b1 b2 a01 张三 a02 数学 a02 ...
- angular随笔
angular个别情况scope值不能改变或者不能绑定[如:指令内ctrl.$setViewValue()不能直接改变input的val值,该处需要使用scope.$apply] 如之前写的简单指令 ...
- awk sed
awk -F '|' '{print $3","$4","$5}' cred.ts | sed 's/-//g'
- 自然语言16_Chunking with NLTK
Chunking with NLTK 对chunk分类数据结构可以图形化输出,用于分析英语句子主干结构 # -*- coding: utf-8 -*-"""Created ...
- JSP简单标签开发
一.继承自SimpleTag接口的自定义标签实现类称为简单标签,接口中5个方法 1.setJspContext方法 用于把JSP页面的PageContext对象传递给标签处理器对象 2.setPare ...
- docker快速启动脚本
#!/bin/sh PID=$(docker inspect --format "{{.State.Pid}}" $1) nsenter -t $PID -u -i -n -p n ...