gpt4 book ai didi

c++ - lua_register 使用 const char * actionname, void(*action)()

转载 作者:太空狗 更新时间:2023-10-29 21:13:26 26 4
gpt4 key购买 nike

我有一个 lua_State 准备好使用将调用 actionname 的脚本。在脚本启动之前,需要注册一个 void(*action)()。此过程由无权访问我的 lua_State 的客户端调用,客户端也不包含 lua。我无法将方法签名更改为 lua_CFunction,因为客户端代码不知道提供该功能所需的定义。

我必须在这里提供这样的功能:

void registeraction(const char * actionname, void(*action)())
{
struct functor
{
void(*action)();
functor(void(*action)()) : action(action) {}
int operator()(lua_State* state) { action(); return 0; }
};
functor callme{ action };
lua_State * L = lua->ptr;
const char * n = actionname;
lua_CFunction f{ callme }; //no suitable conversion
lua_register(L, n, f);
}

我如何包装 Action 以便将其推送到 Lua 中?

最佳答案

一种直接的方法是给 Lua 一个 C 闭包。

您需要一个充当调度程序的静态函数。当您注册新操作时,您将推送新的 C 闭包,将用户提供的函数设置为闭包的上值。

当 Lua 调用它时,您将从 upvalue 读取指针并调用该函数。

#include <stdlib.h>
#include <stdio.h>
#include <lua.hpp>

typedef void(*Action)();

// user actions
void some_action()
{
printf("Must act\n");
}

void other_action()
{
printf("Hello world\n");
}

lua_State* L;
static int action_dispatcher(lua_State* L);

// this function will be exposed to users
void register_action(const char* name, Action act)
{
lua_pushlightuserdata(L, (void*)act);
lua_pushcclosure(L, &action_dispatcher, 1);
lua_setglobal(L, name);
}

int action_dispatcher(lua_State* L)
{
Action action = (Action) lua_topointer(L, lua_upvalueindex(1));
if(action) action();
return 0;
}

// test it
int main()
{
L = luaL_newstate();

// register actions
register_action("act", &some_action);
register_action("world", &other_action);

// "run" script that will call registered actions
luaL_dostring(L, "act() world()");
lua_close(L);
return EXIT_SUCCESS;
}

关于c++ - lua_register 使用 const char * actionname, void(*action)(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44141375/

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