Я пытаюсь разоблачить мою std::map<std::string, std::string>
как свойство класса для Lua. Я установил этот метод для моего геттера и сеттера:
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();
Ранее я делал это для метода получения:
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;
}
Это прекрасно работает, но не позволяет мне использовать метод установки. Например:
player.scripts["movement"].properties["stat"] = "idle"print(player.scripts["movement"].properties["stat"])
В этом коде он просто вызывает метод getter в обеих строках. Хотя, если бы он позволил мне использовать setter, я бы не смог получить ключ из свойств, которые он ["stat"]
Прямо здесь.
Есть ли здесь эксперт по LuaBind? Я видел, как большинство людей говорят, что никогда не работали с этим раньше.
Вы должны использовать (без документов) make_function()
сделать объекты из функций.
metatable["__index"] = luabind::make_function(L, &this->GetMeta);
metatable["__newindex"] = luabind::make_function(L, &this->GetMeta);
К сожалению, эта (самая простая) перегрузка make_function
сломан, но вам просто нужно вставить f
в качестве второго параметра в make_function.hpp
,
Других решений пока нет …