Я отказался от попыток сделать это в 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. Не все объекты имеют такие идентификаторы, как Vec3 и Ang3 и все такое.