我对Lua完全陌生。据我了解,可以将Lua变量和方法绑定到C / C ++端的变量和方法。
但是是否可以将用户类型变量绑定到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
“ score”吗?
解决方案
感谢@Vlad提供指导!
我上来使用sol2,我认为这是绑定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
答案 0 :(得分:1)
对象player
的元表应设置为字段__index
/ __newindex
设置为C函数,当Lua尝试读取或写入不存在的字段时将调用该函数在Lua对象中。
通常,代表本地对象(在您的情况下为player
的Lua对象将是userdata
,既可以存储指向C ++对象的指针,也可以将其托管在其存储中。
元方法__index
/ __newindex
将在参数中接收对所查询对象的引用,键值(例如您的score
字段)以及在以下情况下要存储的值: __newindex
元方法。这样您就可以轻松找到您的本机对象和所需的属性。
有些人更喜欢使用现有的绑定解决方案-tolua ++ / sol / luabind / etc,但是自己实现所需的功能非常简单。