Nano Hash - криптовалюты, майнинг, программирование

Как определить, зарегистрирован ли пользовательский тип C++ в tolua

Мы используем tolua++ для создания привязок Lua для классов C++.

Предположим, у меня есть класс С++:

class Foo
{
    //Some methods in Foo, irrelevant to question.
};

и файл tolua .pkg со следующим содержимым

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, где «Bar», мы получаем 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.   
}

Есть ли способ сделать это с помощью толуа?

15.04.2010

Ответы:


1

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

19.04.2010

2

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

16.04.2010
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..