я отказался от попыток сделать это в C++, так что я сделал это в Lua. Я просматриваю все метатеги (_R) и назначаю мета-методы.
_R.METAVALUES = {}
for key, meta in pairs(_R) do
meta.__oldindex = meta.__oldindex or meta.__index
function meta.__index(self, key)
_R.METAVALUES[tostring(self)] = _R.METAVALUES[tostring(self)] or {}
if _R.METAVALUES[tostring(self)][key] then
return _R.METAVALUES[tostring(self)][key]
end
return meta.__oldindex(self, key)
end
function meta.__newindex(self, key, value)
_R.METAVALUES[tostring(self)] = _R.METAVALUES[tostring(self)] or {}
_R.METAVALUES[tostring(self)][key] = value
end
function meta:__gc()
_R.METAVALUES[tostring(self)] = nil
end
end
Проблема в том, что я должен использовать для индекса. tostring (self) работает только для тех объектов с идентификатором, возвращаемым tostring. Не все объекты имеют ID, такие как Vec3 и Ang3, и все такое.
Является ли атрибут string 'foo' произвольным или представляет собой атрибут объекта userdata? – gwell
Обратите внимание, что 'lua_rawset()' пропускает доступ к метатебельному. Вот почему он «сырой». Вы хотите использовать любую из других функций API, которые управляют записями таблицы, чтобы использовать метаметоды. – RBerteig
foo - это просто переменная, которую я использую, чтобы показать, что я хочу что-то хранить в пользовательских данных из lua. – CapsAdmin