gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:14 24 4
gpt4 key购买 nike

我正在使用 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() 函数?

谢谢!

最佳答案

没有。 成员函数不是自由函数。类型完全不同,指向成员函数 (PTMF) 的指针是完全不同的、与函数指针不兼容的对象。 (例如,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);
/* ... */
}

这里的概念性问题是您有一个引擎,尽管您实际上只有它的一个实例。对于具有许多对象的真正类,PTMF 没有意义,因为您必须指定要用于调用的对象,而您的引擎类可能本质上是一个可以完全静态的单例类(即美化的命名空间).

关于C++类成员函数指针指向函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6908591/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com