C++ 如何设置一个元表以从另一个元表继承,同时将userdata更改为另一种类型?

C++ 如何设置一个元表以从另一个元表继承,同时将userdata更改为另一种类型?,c++,inheritance,struct,lua,lua-userdata,C++,Inheritance,Struct,Lua,Lua Userdata,我正试图找出一种好方法,使userdata从基本userdata对象派生 我希望能够做到这一点: local item = me:GetCurrentItem() print(item:GetPos()) 而不是: local item = me:GetCurrentItem() print(item:GetBaseObject():GetPos()) 在这些示例中,me:GetCurrentItem()使用一些函数返回userdata,但它缺少item:GetBaseObject()返回的

我正试图找出一种好方法,使userdata从基本userdata对象派生

我希望能够做到这一点:

local item = me:GetCurrentItem()
print(item:GetPos())
而不是:

local item = me:GetCurrentItem()
print(item:GetBaseObject():GetPos())
在这些示例中,me:GetCurrentItem()使用一些函数返回userdata,但它缺少item:GetBaseObject()返回的基函数

我将Lua绑定到Crysis Wars SDK中用于学习目的。SDK提供了一个到基本实体(结构)的接口。IItem结构(me:GetCurrentItem())是相同的。 因为这些都是结构,所以我无法将它们转换为基本结构或调用其基本函数。我必须使用IEntity*GetEntity()函数

我尝试在_索引中更改自指针,但它会导致局部变量“item”变为“entity”,这很明显,但我希望它在调用GetPos函数后恢复,这似乎不合逻辑


有人对此问题有好的解决方案吗?

显而易见的解决方案是定义一个执行重定向的item:GetPos()函数

function Item:GetPos()
  return self:GetBaseObject():GetPos()
end
其中Item是项的元表

这与在元表上进行更改一样高效,而且问题更少

编辑:我也可以在重复性方面帮你们一点忙

您可以实现以下两个功能:

function delegate(klass, methodName, memberName)
  klass[methodName] = function(self, ...)
    local member = self[memberName]
    if type(member) == 'function' then member = self[memberName](self) end
    return member[methodName](member, ...)
  end
end
然后像这样使用它:

delegate(Item, 'GetPos', 'GetBaseObject')
这一行与上面的
Item:GetPos
3行定义相同

如果需要多次重复此操作,可以使用以下其他功能进一步优化:

function delegateMany(klass, methodNames, memberName)
  for _,methodName in ipairs(methodNames) do
    delegateMethod(klass, methodName, memberName)
  end
end
这将允许您执行以下操作:

deletageMany(Item, {'GetPost', 'SetPos', 'GetColor', 'SetColor'}, 'GetBaseObject')

我还没有测试过这些函数,所以要小心bug。它们应该同时使用“获取的属性”(
self:GetSomething()
以及简单访问
self.something
)。代码假定您将始终使用“:”来调用委托方法,因此在需要时添加
self

如果没有好办法,我想这样做。在所有类中再次添加相同的函数将是一项非常重复的任务,因为基本实体有许多函数我将要使用。也许我只需要意识到这是正确的方法。@CapsAdmin重复代码从来都不是一件好事。我已经添加了一些代码,可以让您以更干净的方式做您想做的事情。如果你有任何问题,请告诉我。我想在C++中做这件事,但是在Lua做它似乎并不是一个坏主意。我建议从LUA实现开始,如果后来它被识别为瓶颈,那么用C++实现它。不过,很可能不需要这样做。另外,谢谢你接受我的回答!