如何编写 Lua 包装,使用一个可能返回多个类型的方法从栈中返回一个值?
2014-6-16 23:53:22
收藏:0
阅读:80
评论:1
有人能解释一下为什么下面的代码不起作用,并提出建议,以使其起作用。 如果可能的话,我愿意不使用 Boost。从代码中应该很明显我正在尝试做什么。 **问题在于我不知道方法返回的类型是什么,直到运行时? **
template <typename T>
T getAs()
{
if(typeid(T) == typeid(std::string))
return lua_tostring(lua, stackPos);
if((typeid(T) == typeid(int)) || (typeid(T) == typeid(long)))
return lua_tointeger(lua, stackPos);
if((typeid(T) == typeid(float)) || (typeid(T) == typeid(double)))
return lua_tonumber(lua, stackPos);
if(typeid(T) == typeid(bool))
return lua_toboolean(lua, stackPos);
}
错误消息的一部分:
从中无法将“lua_Integer”(又名“long”)转换为“std :: basic_string <char>”的适当转换
返回lua_tointeger(lua,stackPos);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/lua.h:320:28:注意,从宏'luate')扩展了
#define lua_tointeger(L,i) lua_tointegerx(L,i,NULL)
^~~~~~~~~~~~~~~~~~~~~~~~
test.cpp:20:15:注意,在此处请求函数模板专业化'cppLua :: luaStackItem :: getAs <std :: basic_string <char>> '
cout << I.getAs<std::string>() << endl;
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
模板是编译时概念,不是运行时概念。二进制文件中没有模板代码。因此,你的
getAs无法编译:有时你不能返回一种类型,有时你又返回另一种类型。不过,你可以这样做:// 定义通用模板: template <typename T> T getAs(); // 为不同返回类型定义特化: template <> std::string getAs<std::string>() { return lua_tostring(lua, stackPos); } template <> int getAs<int>() { return lua_tointeger(lua, stackPos); } template <> float getAs<float>() { return lua_tonumber(lua, stackPos); } template <> bool getAs<bool>() { return lua_toboolean(lua, stackPos); }然后当你执行
编译器将选择正确的特化。运行时将只包含
getAs的模板实例,在源代码中使用过的实例。