c++ - 有没有一种方法可以将 Lua 成员变量绑定(bind)为使用该变量的名称调用 C/C++ 函数

标签 c++ c lua

我对 Lua 完全陌生。据我了解,可以将 Lua 变量和方法绑定(bind)到 C/C++ 端的变量和方法。

但是否可以将用户类型变量绑定(bind)到 C/C++ 函数的调用,这可能看起来像 Lua 端的属性?

例子:

// C++
struct player {
  int get_value(const std::string& property) const {
    auto it = values.find(name);

    if (it != values.end()) {
      return it->second;
    }

    return -1;
  }

  std::map<std::string, int> values;
};

在 Lua 方面:

-- Lua
p = player.new()
print(p.score)

所以当我在 Lua 中调用 p.score 时,它被转换为调用 C++ 端的 player::get_value 函数,值为 属性“得分”?

解决方案

感谢@Vlad 的指导!

我想出了使用 sol2在我看来,这是一个非常好的绑定(bind)到 Lua 的 C++ 库!

这是用 sol2 完成的方法:

struct Player {
  sol::object get(const std::string& key, sol::this_state state) {
    const auto& it = values.find(key);

    if (it != values.cend()) {
      return sol::make_object(state, it->second);
    }

    return sol::lua_nil;
  }

  std::map<std::string, int> values;
};

int main() {
  Player player;

  player.values.emplace("score", 123);

  sol::state lua;

  lua.open_libraries(sol::lib::base);
  lua.new_usertype<Player>("Player", sol::meta_function::index, &Player::get);
  lua.set("player", &player);

  lua.script(R"(
    print("Player score: ", player.score)
  )");
  return 0;
}

控制台输出

Player score:   123

最佳答案

对象 player 应该有元表集,字段 __index/__newindex 设置为 C 函数,当 Lua 试图读取时将被调用或者写入Lua对象中不存在的字段。

通常,表示 native 对象(在您的情况下为 player)的 Lua 对象将是一个 userdata,要么存储指向 C++ 对象的指针,要么将其托管在其内部存储。

元方法 __index/__newindex 将在参数中接收对被查询对象的引用、键值(例如你的 score 字段) ,以及在 __newindex 元方法的情况下要存储的值。因此,您可以轻松找到您的 native 对象和所需的属性。

有些人更喜欢使用现有的绑定(bind)解决方案 - tolua++/sol/luabind/等,但自己实现所需功能非常简单。

关于c++ - 有没有一种方法可以将 Lua 成员变量绑定(bind)为使用该变量的名称调用 C/C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54867520/

相关文章:

regex - 在确认空字符串的同时分解字符串中的列表

mysql - CryptDB - 无法连接到代理(错误 1105 (HY000) : (proxy) all backends are down)

c++ - 复制和粘贴 .so 文件不适用于链接器

c++ - 多线程排挤其他进程

c - 如何更好地计算 Kaprekar 数?

c - 0为为多个平台编译的程序安装示例提要文件

c - 用C语言构建链表

c++ - 三个类(class)相互联系

c++ - Boost::Spirit::QI 解析器:解析元素的索引

lua - 在lua中ping服务器