1

我正在尝试在 *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);

scriptsScriptingInterface的一个实例

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

./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代码应该可以毫无问题地编译?

4

1 回答 1

2

问题在这里:

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 正在同时捕获thisfunction。根据 C++11 标准的第 5.1.2/6 段:

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

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

于 2013-04-07T10:06:50.660 回答