Как связать std :: map с Lua с помощью LuaBind

Я пытаюсь разоблачить мою 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? Я видел, как большинство людей говорят, что никогда не работали с этим раньше.

3

Решение

Вы должны использовать (без документов) make_function() сделать объекты из функций.

metatable["__index"] = luabind::make_function(L, &this->GetMeta);
metatable["__newindex"] = luabind::make_function(L, &this->GetMeta);

К сожалению, эта (самая простая) перегрузка make_function сломан, но вам просто нужно вставить f в качестве второго параметра в make_function.hpp,

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]