如何将 Lua 成员变量绑定为调用 C/C++ 的函数,并使用变量名作为函数名称

我对 Lua 还一无所知。但从我所了解的情况来看,可以将 Lua 变量和方法绑定到 C/C++ 的变量和方法上。

但是是否可以绑定用户类型变量,以便在 Lua 方面看起来像属性的 C/C++ 函数的调用?

示例:

// 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 函数的调用,该函数具有 property 值为“score”的值?

解决方案

感谢 @Vlad 的指引!

我使用了 sol2,这是我认为非常好的 C++ 绑定到 Lua 的库!

以下是使用 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
点赞
用户5675002
用户5675002

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

通常,在 Lua 中表示本地对象(在您的情况下为 player)的 Lua 对象将是 userdata,可能存储 C++ 对象的指针,或在其存储空间中托管它。

元方法 __index/__newindex 接收到查询的对象引用、键值(例如,您的 score 字段)和在 __newindex 元方法下存储的值作为参数。因此,您可以轻松找到您的本地对象和所需的属性。

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

2019-02-25 16:27:58