Lua, C++ и разделение на подклассы бедного человека

Вполне возможно, что это проблема или ошибка производительности Google Sheets или даже ваша электронная таблица не работает. Попробуйте воспроизвести проблему, используя другие новые электронные таблицы, одну для таблицы Master Roster, другую для таблицы Secondary Roster. Если проблема не устранена, сообщите о своей проблеме как с помощью Google Feedback (перейдите в меню «Справка», затем нажмите «Сообщить о проблеме»), так и разместив сообщение на официальном справочном форуме / сообществе Документов Google (перейдите по адресу https: // support.google.com/docs, затем нажмите на ссылку Форум / Сообщество в правом верхнем углу страницы)

11
задан Watusimoto 26 May 2009 в 21:31
поделиться

3 ответа

Вы должны сообщить нам, что именно не работает в вашем коде. Я полагаю, что это Lunar :: check (L, 1) , который не работает для всех не-Rocks. Я прав?

Также было бы хорошо, если бы вы указали, какую версию Lunar вы используете (ссылка на нее была бы отличной).

Если это этот , тогда тип класса будет хранится в метатаблице объекта Lua (можно сказать, что эта метатаблица имеет тип ).

Похоже, самый простой способ проверить, является ли объект камнем без исправления Lunar, - это вызвать luaL_getmetatable (L, Rock :: className) , чтобы получить метатаблицу класса и сравнить его с lua_getmetatable (L, 1 ) вашего первого аргумента (обратите внимание на lua L в имени первой функции). Это немного взломано, но должно сработать.

Если у вас все в порядке с исправлением Lunar, один из возможных способов - добавить поле __ lunarClassName в метатаблицу и сохранить там T :: name . Затем предоставьте функцию lunar_typename () C ++ (вне класса шаблона Lunar - поскольку нам там не требуется T ) и верните из нее значение этого __ lunarClassName поле метатаблицы аргумента. (Не забудьте проверить, есть ли у объекта метатаблица и в этой метатаблице есть такое поле.) Вы можете проверить тип объекта Lua, вызвав lunar_typename () then.

Небольшой совет из личного опыта: тем больше бизнес-логики, которую вы отправите в Lua, тем лучше. Если вы не столкнетесь с серьезными ограничениями производительности, вам, вероятно, следует подумать о переносе всей этой иерархии в Lua - ваша жизнь станет намного проще.

Если я могу вам помочь, пожалуйста, скажите так.

Обновление: Решение, которым вы обновили свой пост, выглядит правильным.

Чтобы выполнить диспетчеризацию на основе метатаблиц в C, вы можете использовать, например, карту интегрального lua_topointer () значения luaL_getmetatable () для типа в объект функции / указатель, который знает, как работать с этим типом.

Но, опять же, я предлагаю вместо этого перенести эту часть в Lua. Например: экспортируйте зависящие от типа функции getFiringSolutionForRock () , getFiringSolutionForStone () и getFiringSolutionForRockyStone () из C ++ в Lua. В Lua сохраните таблицу методов по метатаблице:

dispatch =
{
  [Rock] = Robot.getFiringSolutionForRock;
  [Stone] = Robot.getFiringSolutionForStone;
  [RockyStone] = Robot.getFiringSolutionForRockyStone;
}

Если я прав, следующая строка должна вызывать правильный специализированный метод объекта-робота.

dispatch[getmetatable(rock)](robot, rock)
1
ответ дан 3 December 2019 в 11:04
поделиться

I suggest that you define an object oriented system in pure lua, and then write a custom binding to C++ for that aspect of the API.

Lua is well suited for prototype OO implementations, where tables are used for emulating classes, in which one entry has a function called new, which when called returns an appropriate table of the same 'type'.

From C++, however, make a LuaClass that has a .invoke method, accepting a C string (ie, a null-terminated const char array) to specify the name of the member function you want to call, and depending on how you want to handle variable arguments, have several templated versions of this .invoke method for zero, one, two, ... N arguments as neccessary, or define a method of passing a variable number of arguments into it, and there are many ways to do that.

For Lua, I suggest making two .invoke methods, one which expects an std::vector, and another that expects an std::map, but I'll leave that up to you. :)

In my last Lua/C++ project, I used only null-terminated arrays of C-strings, requiring lua to convert the string to an appropriate value.

Enjoy.

1
ответ дан 3 December 2019 в 11:04
поделиться

Я думаю, вы пытаюсь отправить метод не в то место. (Эта проблема является симптомом проблемы всех этих "автоматизированных" способы заставить Lua взаимодействовать с C или C ++: с каждым из них за кулисами творится некое волшебство, и не всегда очевидно, как заставить его работать. Я не понимаю, почему все больше людей не используют Lua C API.)

Я взглянул на веб-страницы Lunar, и мне показалось, что вам нужно создать методы таблица для типа T , а затем вызовите метод Luna :: Register . В сети есть простой пример . Если я правильно читаю код, то на самом деле ни один из связующих кодов в вашем вопросе не является рекомендуемым способом работы с Lunar. (Я также предполагаю, что вы можете реализовать эти методы полностью как вызовы C ++.)

Это все довольно хитроумно, потому что документация по Lunar тонкая. за кулисами творится какое-то волшебство, и не всегда очевидно, как заставить его работать. Я не понимаю, почему все больше людей не используют Lua C API.)

Я взглянул на веб-страницы Lunar, и мне показалось, что вам нужно создать методы таблица для типа T , а затем вызовите метод Luna :: Register . В сети есть простой пример . Если я правильно читаю код, то на самом деле ни один из связующих кодов в вашем вопросе не является рекомендуемым способом работы с Lunar. (Я также предполагаю, что вы можете реализовать эти методы полностью как вызовы C ++.)

Это все довольно хитроумно, потому что документация по Lunar тонкая. за кулисами творится какое-то волшебство, и не всегда очевидно, как заставить его работать. Я не понимаю, почему все больше людей не используют Lua C API.)

Я взглянул на веб-страницы Lunar, и мне показалось, что вам нужно создать методы таблица для типа T , а затем вызовите метод Luna :: Register . В сети есть простой пример . Если я правильно читаю код, то на самом деле ни один из связующих кодов в вашем вопросе не является рекомендуемым способом работы с Lunar. (Я также предполагаю, что вы можете реализовать эти методы полностью как вызовы C ++.)

Это все довольно хитроумно, потому что документация по Lunar тонкая. Я не понимаю, почему все больше людей не используют Lua C API.)

Я взглянул на веб-страницы Lunar, и мне показалось, что вам нужно создать таблицу методов по типу T , а затем вызовите метод Luna :: Register . В сети есть простой пример . Если я правильно читаю код, то на самом деле ни один из связующих кодов в вашем вопросе не является рекомендуемым способом работы с Lunar. (Я также предполагаю, что вы можете реализовать эти методы полностью как вызовы C ++.)

Это все довольно хитроумно, потому что документация по Lunar тонкая. Я не понимаю, почему все больше людей не используют Lua C API.)

Я взглянул на веб-страницы Lunar, и мне показалось, что вам нужно создать таблицу методов по типу T , а затем вызовите метод Luna :: Register . В сети есть простой пример . Если я правильно читаю код, то на самом деле ни один из связующих кодов в вашем вопросе не является рекомендуемым способом работы с Lunar. (Я также предполагаю, что вы можете реализовать эти методы полностью как вызовы C ++.)

Это все довольно хитроумно, потому что документация по Lunar тонкая. и мне кажется, что вам нужно создать таблицу методов для типа T , а затем вызвать метод Luna :: Register . В сети есть простой пример . Если я правильно читаю код, то на самом деле ни один из связующих кодов в вашем вопросе не является рекомендуемым способом работы с Lunar. (Я также предполагаю, что вы можете реализовать эти методы полностью как вызовы C ++.)

Это все довольно хитроумно, потому что документация по Lunar тонкая. и мне кажется, что вам нужно создать таблицу методов для типа T , а затем вызвать метод Luna :: Register . В сети есть простой пример . Если я правильно читаю код, то на самом деле ни один из связующих кодов в вашем вопросе не является рекомендуемым способом работы с Lunar. (Я также предполагаю, что вы можете реализовать эти методы полностью как вызовы C ++.)

Это все довольно хитроумно, потому что документация по Lunar тонкая. Разумной альтернативой было бы выполнить всю работу самостоятельно и просто связать каждый тип C ++ с таблицей Lua, содержащей его методы. Затем у вас есть метаметод Lua __ index , обращающийся к этой таблице, и ваш дядя Боб. Lunar делает что-то , близкое к ним, но он достаточно приправлен шаблонами C ++ и прочей ерундой, и я не уверен, как заставить это работать.

Шаблоны очень умны. Вы можете либо потратить время, чтобы глубоко понять, как это работает, либо пересмотреть, нужно ли и как вы его использовать.

Резюме : для каждого класса создайте явную таблицу методов и зарегистрируйте каждый класс, используя метод Лунного Регистра . Или сверните свой собственный.

5
ответ дан 3 December 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: