有没有办法将Lua成员变量绑定为对C / C ++函数的调用,并使用该变量的名称

问题描述 投票:2回答:1

我对Lua完全不熟悉。根据我的理解,可以将Lua变量和方法绑定到C / C ++端的变量和方法。

但是可以将用户类型变量绑定到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函数,其值为property“得分”?

感谢@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
c++ c lua
1个回答
1
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.