类型安全的 C++/Lua 任意参数互调用
来源:互联网 发布:nginx 指定安装目录 编辑:程序博客网 时间:2024/05/03 08:25
转自: http://gulu-dev.com/post/2016-05-19-cpp-lua-vargs
-- lua sidefunction foo(str, i, f) return string.format("%s, %d, %f", str, i, f)end
// C sideluabridge::LuaRef foo = luabridge::getGlobal(L, "foo");auto retString = foo("bar", 12, 0.25f); // 这里先忽略错误处理
// C sideint CallMe(const std::string& arg1, const std::string& arg2){ return std::stoi(arg1) + std::stoi(arg2); // 同样先不管错误处理}luabridge::getGlobalNamespace(L) .beginNamespace("native") .addFunction("call_me", CallMe) .endNamespace();
-- lua sidesum = native.call_me("15", "20") -- sum = 35
-- lua sidefunction g_post(msgID, ...) _queue:appendMsg({id=msgID, args={...}})end
template<class TRet, class... U>TRet PostMessage(U&&... u) { // 获取对应的函数 auto refFunc = GetGlobal("g_post"); if (!refFunc.isFunction()) return luabridge::LuaRef(L); // 生成携带所有参数的 functor auto func = std::bind(refFunc, std::forward<U>(u)...); // implCallGlobal() 实现略, 使用 try/catch 处理错误,并把返回值转回需要的类型 return implCallGlobal(name, func);}
// C sidePostMessage(MsgType_A, "foo", "bar");PostMessage(MsgType_B, 100, 0.25f, std::string("std::string goes as well.");// 任意的参数组合...
-- lua side{ id=MsgType_A, args={"foo", "bar" } }{ id=MsgType_B, args={100, 0.25, "std::string goes as well." } }-- args 表内可以容纳传过来的任意参数
-- 在 Lua 端简单封装一下function g_post_native(msgID, ...) native.post(msgID, {...})end
// C sideint Post(int msgID, luabridge::LuaRef args){ // 这里的 switch 可以用 template <int N> 来避免分支处理,并消除每一个 case 内重复的代码。具体实现暂略,这里为了清晰直接手写 switch (msgID) { case MsgA: { auto t = tuple_cast<std::string, std::string>(args); return ProcessA(std::get<0>(t), std::get<1>(t)); } case MsgB: { auto t = tuple_cast<int, float, float>(args); return ProcessB(std::get<0>(t), std::get<1>(t), std::get<2>(t)); } } return FAILED_BAD_ID;}
-- lua sideg_post_native(MsgType_A, "foo", "bar");g_post_native(MsgType_B, 100, 0.1, 12.5);
// C sideint ProcessA(const std::string& s1, const std::string& s2);int ProcessB(int arg1, float arg2, float arg3);
0 0
- 类型安全的 C++/Lua 任意参数互调用
- Lua 任意类型的get/set方法
- LUA 调用 C 时候获取参数个数
- button传递任意类型的参数
- 内存安全的 Lua api 调用
- C语言函数调用传递参数时的类型退化
- lua 和c的调用
- any-----安全存储任意类型
- VC++调用Lua有参数的函数
- Lua调用C++带参数的方法
- C/C++的类型安全
- C/C++的类型安全
- C/C++的类型安全
- C/C++的类型安全
- C/C++的类型安全
- python调用c函数参数类型问题
- C/C++中stdarg.h或cstdarg编写如printf一样参数可以是变长的任意类型和任意个数的函数
- lua 与 c/c++ 交互(3)c/c++ 调用 lua 数组类型 table
- Delphi WebBroker 上传文件
- 用Java实现FTP批量大文件上传下载(二)
- mysql 数据库操作日志跟踪
- hadoop2 namenode HA的问题
- android实现一键上传logcat
- 类型安全的 C++/Lua 任意参数互调用
- 2016第七届蓝桥杯JavaB组省赛
- 用Java编写二维码
- 用Python抓取百度地图里的店名,地址和联系方式
- 用Java实现FTP批量大文件上传下载(三)
- C++作业3
- [044]利用FFM做新闻源评级一算法调研
- 递归
- 用Java实现FTP批量大文件上传下载(四)