网络游戏服务器开发::用模板偏特化封装C++调用lua的代码
2010-06-08 10:15
736 查看
主要用到了模板偏特化,下面放出代码。
PushValue是用来选择参数的模板,用模板偏特化来决定调用tolua_pushnumber还是tolua_pushusertype
typeid可以得到类名字,都是在编译期决定的。
luaCall就是要用的函数啦。返回值是void,也可以对有其他返回值的需求进行封装。
如果以后还需要使用其它类型,只需要实现一个特化的PushValue就行了
/* * ===================================================================================== * * Filename: LuaCall.h * * Description: luaCall * * Version: 1.0 * Created: 2010年06月03日 09时27分55秒 * Revision: none * Compiler: gcc * * Author: wangfan (), wangfan1985@gmail.com * Company: * * ===================================================================================== */ #include "lua.hpp" #include "tolua++.h" template<typename T> struct PushValue { static inline void push(lua_State* L,T t); }; template<> inline void PushValue<uint32_t>::push(lua_State* L,uint32_t t) { tolua_pushnumber(L, t); } template<> inline void PushValue<char*>::push(lua_State* L,char* t) { tolua_pushstring(L, t); } template<typename T> struct PushValue<T*> { static inline void push(lua_State* L,T* t) { const char* temp = typeid(t).name(); ++temp; if(*temp >= '0' && *temp <= '9') { ++temp; if(*temp >= '0' && *temp <= '9') ++temp; } tolua_pushusertype(L, t, temp); } }; static inline void luaCall(lua_State* L,const char *name) { lua_getglobal(L, name); int ret = lua_pcall(L, 1, 0, 0); if(ret != 0) { const char* error = lua_tostring(L, -1);//打印错误结果 printf("[%u]%s",ret,error); lua_pop(L, 1); } } template<typename T1> static inline void luaCall(lua_State* L,const char *name,T1 t1) { lua_getglobal(L, name); PushValue<T1>::push(L,t1); int ret = lua_pcall(L, 1, 0, 0); if(ret != 0) { const char* error = lua_tostring(L, -1);//打印错误结果 printf("[%u]%s",ret,error); lua_pop(L, 1); } } template<typename T1,typename T2> static inline void luaCall(lua_State* L,const char *name,T1 t1,T2 t2) { lua_getglobal(L, name); PushValue<T1>::push(L,t1); PushValue<T2>::push(L,t2); int ret = lua_pcall(L, 2, 0, 0); if(ret != 0) { const char* error = lua_tostring(L, -1);//打印错误结果 printf("[%u]%s",ret,error); lua_pop(L, 1); } }
PushValue是用来选择参数的模板,用模板偏特化来决定调用tolua_pushnumber还是tolua_pushusertype
typeid可以得到类名字,都是在编译期决定的。
luaCall就是要用的函数啦。返回值是void,也可以对有其他返回值的需求进行封装。
如果以后还需要使用其它类型,只需要实现一个特化的PushValue就行了
相关文章推荐
- 网络游戏服务器开发:脚本系统的制作,linux下使用tolua制作Lua脚本系统(不需要PKG文件)
- MMORPG大型游戏设计与开发(服务器 游戏场景 掉落与网络连接)
- Unity3D游戏开发之网络游戏服务器架构设计培训(如何做一名主程)
- 网络游戏服务器开发(一)
- 【iOS-cocos2d-X 游戏开发之十三】cocos2dx通过Jni调用Android的Java层代码(上)
- Android游戏开发cocos2d-x调用Java层代码
- 网络游戏资源代码热更新开发方案
- Unity3D游戏开发之网络游戏服务器架构设计培训
- openwrt 问题二 js 通过nginx 服务器调用 lua代码的过程实现
- html5 Game开发系列文章之 三 搭建基本游戏框架(代码封装)
- 网络开发时一些调用设置的代码
- 【iOS-cocos2d-X 游戏开发之十三】详细讲解在Xcode中利用预编译并通过Jni调用Android的Java层代码(cocos2dx里访问调用Android函数)!
- Android开发中:调用网络封装类实现网络判断
- 【iOS-cocos2d-X 游戏开发之十三】cocos2dx通过Jni调用Android的Java层代码(下)
- 网络游戏服务器开发::学习了两天python写了一个linux下自动安装程序的脚本
- nodejs 开发网络游戏服务器时常会出现异常数据的总结
- 网络游戏服务器开发:用crontab自动做版本
- 微信小程序基本的开发框架抽取,包括网络请求的二次封装,页面状态管理,常见页面模板封装
- Cocos2d-x游戏开发之Cocos2dx通过JNI调用Android的Java代码(webView实例)
- Go游戏服务器开发的一些思考(九):Docker桥接网络及固定IP (二)