我正在尝试将我的std::map<std::string, std::string>
作为类属性公开给Lua。我为getter和setter设置了这个方法:
luabind::object FakeScript::GetSetProperties()
{
luabind::object table = luabind::newtable(L);
luabind::object metatable = luabind::newtable(L);
metatable["__index"] = &this->GetMeta;
metatable["__newindex"] = &this->SetMeta;
luabind::setmetatable<luabind::object, luabind::object>(table, metatable);
return table;
}
这样我就能在Lua中做到这样的事情:
player.scripts["movement"].properties["stat"] = "idle"
print(player.scripts["movement"].properties["stat"])
但是,我在C ++中提供的代码没有编译。它告诉我在这一行metatable["__index"] = &this->GetMeta;
及其后面的行上有一个模糊的调用重载函数。我不确定我是否正确这样做。
错误讯息:
error C2668: 'luabind::detail::check_const_pointer' :
ambiguous call to overloaded function
c:\libraries\luabind-0.9.1\references\luabind\include\luabind\detail\instance_holder.hpp 75
这些是SetMeta
中的GetMeta
和FakeScript
:
static void GetMeta();
static void SetMeta();
以前我这样做是为了获取getter方法:
luabind::object FakeScript::getProp()
{
luabind::object obj = luabind::newtable(L);
for(auto i = this->properties.begin(); i != this->properties.end(); i++)
{
obj[i->first] = i->second;
}
return obj;
}
这很好用,但它不允许我使用setter方法。例如:
player.scripts["movement"].properties["stat"] = "idle"
print(player.scripts["movement"].properties["stat"])
在这段代码中,它只是在两行中触发getter方法。虽然如果它让我使用setter,我将无法从["stat"]
的属性中获取密钥。
LuaBind上有专家吗?我见过大多数人说他们之前从未使用过它。
答案 0 :(得分:3)
您需要使用(未记录的)make_function()
从函数中创建对象。
metatable["__index"] = luabind::make_function(L, &this->GetMeta);
metatable["__newindex"] = luabind::make_function(L, &this->GetMeta);
不幸的是,make_function
的这个(最简单的)重载被破坏了,但你需要insert f
作为make_function.hpp
中的第二个参数。