这是一个几年前写的对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 ...
随机推荐
-
[GraphQL] Use GraphQL&#39;s Object Type for Basic Types
We can create the most basic components of our GraphQL Schema using GraphQL's Object Types. These ty ...
-
JavaScript异常捕获
理论准备 ★ 异常捕获 △ 异常:当JavaScript引擎执行JavaScript代码时,发生了错误,导致程序停止运行: △ 异常抛出:当异常产生,并且这个异常生成一个错误信息: △ 异常捕获: ...
-
Oracle EBS 寄售业务总结
总述: 须通过一揽子采购协议(BPA)明确采购方与供应商之间的寄售关系,及各种协议条款: 通过来源补充规则(Sourcing Rules)明确物料的供应商以及分配规则: 通过合格供应商列表(ASL)明 ...
-
wikioi1450 xth的旅行
题目描述 Description 毕业了,Xth很高兴,因为他要和他的 rabbit 去双人旅行了.他们来到了水城威尼 斯.众所周知(⊙﹏⊙b汗),这里的水路交通很发达,所以 xth 和 rabbit ...
-
Python数据运算
身份运算 is is是判断两个标识符是不是引用自一个对象 x is y, 如果id(x)等于id(y), is 返回结果1 is not is not 是判断两个标识符是不是引用自不同对象 x is ...
-
Dubbo 源码分析 - 集群容错之 LoadBalance
1.简介 LoadBalance 中文意思为负载均衡,它的职责是将网络请求,或者其他形式的负载"均摊"到不同的机器上.避免集群中部分服务器压力过大,而另一些服务器比较空闲的情况.通 ...
-
剑指offer 04:重构二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
-
ln 链接命令 简要说明 软硬链接关系说明
ln [选项] 目标 -s 创建符号链接(软链接) -f 强制创建链接 -i 覆盖前先询问 -v 显示创建链接过程 ln命令不能对目录创建硬链接,但可以创建软链接,对目录的软链接经常被用到 删除软链接 ...
-
Mysql数据库单表查询
1.单表查询语法 #查询数据的本质:mysql会到你本地的硬盘上找到对应的文件,然后打开文件,按照你的查询条件来找出你需要的数据.下面是完整的一个单表查询的语法 select * from,这个sel ...
-
php yii 命令
php yii 敲回车 This is Yii version 2.0.11. The following commands are available: - asset Allows you to ...