Как определить, был ли тип пользователя C ++ зарегистрирован в tolua - PullRequest
4 голосов
/ 15 апреля 2010

Мы используем 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 вызывает segfault в 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 ]

1 голос
/ 19 апреля 2010

Я использую толуу, а не толуу ++, но будем надеяться, что это как-то похоже.В 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.»).

0 голосов
/ 16 апреля 2010

Я только начинающий lua, поэтому я предлагаю: обернуть ваши вызовы tolua в вашу собственную функцию, которая отслеживает классы, зарегистрированные через нее. Теперь вы можете спросить свою обертку, знает ли толуа о вашем классе.

...