Я пытаюсь настроить некоторые вещи с помощью Lua, но особенности Lua не важны для моего вопроса.
То, что я хотел бы сделать, это вызвать функцию, скажем OpenLib<T>(L)
, и заставить ее получить имя таблицы для определенного класса (а также его таблицы) и зарегистрировать его в Lua.По сути это сводится к следующему:
template <class T>
static void OpenLib(lua_State* L)
{
// this func does some other stuff too that I'm omitting, important bit below
if (T::myTable && T::myTableName)
{
luaL_openlib(L, T::myTableName, T::myTable, 0);
}
}
Я пробовал это несколькими разными способами, и я не могу заставить его работать правильно.Я попытался создать базовый класс, содержащий myTable и myTableName, например:
class LuaInfo
{
public:
static const char* myTableName;
static luaL_reg* myTable;
}
Тогда я мог бы просто наследовать от LuaInfo, а затем заполнить необходимую информацию.Это не сработало, потому что все классы, наследуемые от LuaInfo, получали бы одну и ту же информацию, поэтому я огляделся по сторонам, и у меня возникла идея сделать это:Теперь я должен сделать класс Widget: public LuaInfo, но это было ближе к работе.
template <class T>
void OpenLib(lua_State* L)
{
if (T::myTable && T::myTableName)
{
luaL_openlib(L, LuaInfo<T>::myTableName, LuaInfo<T>::myTable, 0);
}
}
Я попробовал несколько вариантов этого, чтобы попытаться понять это правильно, но я продолжаю получать ошибки, такие как
undefined reference to `ag::LuaInfo<ag::ui::Widget>::myTable'
Возможно ли то, что я хочу сделать, и если да, то, как правильно это делать?