繁体   English   中英

函数指针的C ++ lua桥问题

[英]C++ lua bridge problems with function pointers

我试图在* lua_CFunction *上创建一个简单的c ++包装器,其定义如下:

// header
typedef int (*lua_CFunction) (lua_State* lua);
...
lua_CFunction wrap (std::function <int (Game* game)> function);
// implementation
lua_CFunction ScriptingInterface::wrap (std::function <int (Game* game)> function) 
{
    return [this, function] (lua_State* unused) -> int {
        int n_args = function (this->game);
        return n_args;
    };
}
void ScriptingInterface::registerFunction (std::string name, std::function <int (Game* game)> function) 
{
    lua_register (lua, name.c_str (), wrap (function));
}

这个想法是创建这样的公共功能:

int setTitle (Game* interface) 
{
    const char* title = lua_tostring (interface->getScripts ()->getLuaState (), 1);

    SDL_WM_SetCaption (title, NULL);

    return 0;
}

并与lua共享它们,例如:

scripts->registerFunction ("setTitle", setTitle);

脚本ScriptingInterface的一个实例

尝试编译游戏时出现问题。

./scripting/scripting_interface.cc: In member function ‘int (* ScriptingInterface::wrap(std::function<int(Game*)>))(lua_State*)’:
./scripting/scripting_interface.cc:40:2: error: cannot convert ‘ScriptingInterface::wrap(std::function<int(Game*)>)::<lambda(lua_State*)>’ to ‘int (*)(lua_State*)’ in return
./scripting/scripting_interface.cc:41:1: warning: control reaches end of non-void function [-Wreturn-type]

谁能告诉我我在这里做错了什么,因为AFAIK代码可以毫无问题地进行编译?

问题在这里:

lua_CFunction ScriptingInterface::wrap(std::function<int(Game*)> function) 
{
    return [this, function] (lua_State* unused) -> int {
        int n_args = function (this->game);
        return n_args;
    };
}

您试图返回一个需要函数指针的lambda,但是捕获的 lambda无法转换为函数指针-并且您的lambda既捕获了this又捕获了function 根据C ++ 11标准的5.1.2 / 6段:

没有lambda捕获的lambda表达式的闭包类型具有指向该函数的指针的公共非虚拟非显式const转换函数,该函数具有与闭包类型的函数调用运算符相同的参数和返回类型。 该转换函数返回的值应是一个函数的地址,该函数在被调用时与调用闭包类型的函数调用操作符具有相同的作用。

不幸的是,除非您可以返回std::function<int(lua_State*)> ,否则您将不得不更改设计。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM