我使用 luabind 作为我的 lua 到 C++ 包装器。 Luabind提供了一种使用我自己的回调函数来处理lua抛出的异常的方法,set_pcall_callback()。因此,我解释了文档中的一个示例,更改是 logger->log() 函数,并将该函数放入名为“Engine”的类中,因此它不再是常规的全局函数,而是现在的成员函数,即我的问题似乎出在哪里。
以下是相关代码片段:
class Engine //Whole class not shown for brevity
{
public:
Engine();
~Engine();
void Run();
int pcall_log(lua_State*);
private:
ILogger *logger;
};
Engine::Run()
{
lua_State* L = lua_open();
luaL_openlibs(L);
open(L);
luabind::set_pcall_callback(&Engine::pcall_log); //<--- Problem line
//etc...rest of the code not shown for brevity
}
int Engine::pcall_log(lua_State *L)
{
lua_Debug d;
lua_getstack( L,1,&d);
lua_getinfo( L, "Sln", &d);
lua_pop(L, 1);
stringstream ss;
ss.clear();
ss.str("");
ss << d.short_src;
ss << ": ";
ss << d.currentline;
ss << ": ";
if ( d.name != 0)
{
ss << d.namewhat;
ss << " ";
ss << d.name;
ss << ") ";
}
ss << lua_tostring(L, -1);
logger->log(ss.str().c_str(),ELL_ERROR);
return 1;
}
这是编译器在编译过程中所说的内容:
C:\pb\engine.cpp|31|error: cannot convert 'int (Engine::*)(lua_State*)' to 'int (*)(lua_State*)' for argument '1' to 'void luabind::set_pcall_callback(int (*)(lua_State*))'|
所以看来错误在于该函数需要常规函数指针,而不是类成员函数指针。有没有办法强制转换或使用中间函数指针传递给 set_pcall_callback() 函数?
谢谢你!
No. 成员函数不是自由函数。类型完全不同,并且指向成员函数的指针 (PTMF) 是与函数指针完全不同且不兼容的对象。 (例如,PTMF 通常要大得多。)最重要的是,指向成员的指针必须始终与指向要调用其成员的对象的实例指针一起使用,因此您甚至不能usePTMF 与使用函数指针的方式相同。
与 C 代码交互的最简单的解决方案是编写一个全局包装函数来分派您的调用,或者使您的成员函数static(在这种情况下,它本质上成为一个自由函数):
// global!
Engine * myEngine;
int theCallback(lua_State * L)
{
return myEngine->pcall_log(L);
}
Engine::Run()
{
/* ... */
myEngine = this;
luabind::set_pcall_callback(&theCallback);
/* ... */
}
这里的概念问题是你有一个引擎class,尽管您实际上只会拥有它的一个实例。对于具有许多对象的真正类,PTMF 没有意义,因为您必须指定要用于调用的对象,而您的引擎类可能本质上是一个可以完全静态的单例类(即美化的命名空间) )。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)