Как определить, был ли тип пользователя C++ зарегистрирован в tolua
Мы используем tolua ++ для генерации привязок Lua для классов C++.
Предположим, у меня есть класс C++:
class Foo
{
//Some methods in Foo, irrelevant to question.
};
и файл.pkg tolua со следующим содержимым
class Foo
{
};
Рассмотрим следующую функцию:
void call_some_lua_function(lua_State* luaState)
{
Foo* myFoo = new Foo();
tolua_pushusertype(luaState, (void*)myFoo, "Foo");
//More code to actually call Lua, irrelevant to question.
}
Теперь актуальный вопрос:
tolua_pushusertype вызывает ошибку в Lua, если 3-й параметр не соответствует допустимой полностью определенной строке класса C++, которая была зарегистрирована при вызове tolua_cclass. Таким образом, если параметр 3, где "Бар", мы получаем segfault.
Я хотел бы сделать следующее:
void call_some_lua_function(lua_State* luaState)
{
//determine if tolua is aware of my type, how to do this?
//Something like:
//if(!tolua_iscpptype_registered("Foo"))
//{
// abort gracefully
//}
Foo* myFoo = new Foo();
tolua_pushusertype(luaState, (void*)myFoo, "Foo");
//More code to actually call Lua, irrelevant to question.
}
Есть ли способ сделать это с помощью толуа?
2 ответа
Я использую толуу, а не толуу ++, но будем надеяться, что это как-то похоже. В tolua вы можете проверить, зарегистрирован ли класс в нем следующим образом:
tolua_getmetatable(L, "ClassName");
if (lua_isnil(L, -1)) {
// the class wasn't found
}
Подсказка: проверьте, как реализован tolua.cast, и проверьте его аргументы. Он принимает имя типа в виде строки.
Отредактировано: более любопытно, я скачал исходники tolua ++ и заглянул внутрь. Это не выглядит полностью похоже, и критическая функция отсутствует. Я должен дать вам непроверенное предложение, которое может работать:
luaL_getmetatable(L, "ClassName");
if (lua_isnil(L, -1)) {
// the class wasn't found
}
Разница между tolua и tolua ++, по-видимому, заключается в том, что tolua использует "пространство имен" для созданных метатаблиц (префикс "tolua.").
Я просто начинающий lua, поэтому я предлагаю: обернуть ваши вызовы tolua в вашу собственную функцию, которая отслеживает классы, зарегистрированные через нее. Теперь вы можете спросить свою обертку, знает ли толуа о вашем классе.