C++类成员函数指针指向函数指针

Bri*_*ian 5 c++ casting function-pointers luabind

我使用luabind作为我的lua到C++包装器.Luabind提供了一种方法来使用我自己的回调函数来处理lua,set_pcall_callback()抛出的异常.所以,我借从文档为例,变革中的logger->日志()函数,并把该函数在一个名为"引擎"类,所以代替它是一个常规的全局函数它是现在是一个成员函数,这是我的问题似乎在哪里.

以下是相关的代码剪辑:

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;
}
Run Code Online (Sandbox Code Playgroud)

以下是编译器在编译期间所说的内容:

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*))'|
Run Code Online (Sandbox Code Playgroud)

所以似乎错误是函数需要常规函数指针,而不是类成员函数指针.有没有办法转换或使用中间函数指针传递给set_pcall_callback()函数?

谢谢!

Ker*_* SB 12

.会员功能不是免费功能.类型完全不同,指向成员函数(PTMF)的指针是一个完全不同的,与函数指针不兼容的对象.(A PTMF通常是更大的,例如.)最重要的一个指针到成员必须始终连同一个实例指针,你要调用其成员对象使用,所以你甚至不能使用一个PTMF以同样的方式你使用函数指针.

与C代码交互的最简单的解决方案是编写一个全局包装函数来调度您的调用,或者使您的成员函数保持静态(在这种情况下,它实际上变成了一个自由函数):

// global!

Engine * myEngine;
int theCallback(lua_State * L)
{
  return myEngine->pcall_log(L);
}

Engine::Run()
{
  /* ... */
  myEngine = this;
  luabind::set_pcall_callback(&theCallback);
  /* ... */
}
Run Code Online (Sandbox Code Playgroud)

这里的概念问题是你有一个引擎,尽管你实际上只有一个实例.对于许多对象真正的类别,PTMF是没有意义的,因为你必须指定要使用哪个对象为号召,而你的引擎类也许本质上是一个单独的类可能是完全静态的(即一个华而不实的命名空间).