假设我有一个从C端拥有的指针,我希望以userdata的形式将其推送到Lua堆栈中。在不牺牲指定特定元表的能力的情况下,最好的方法是什么?
我的原始想法是使用轻量级userdata,但是根据我所读到的这里,所有轻量级userdata共享一个公共的元表。这并不理想,因为它会强制所有C端对象具有共同的行为。
考虑到我希望为Lua分配的对象重用元表,并简单地将不同的this指针传递给元方法,我的第二个想法涉及将人工this指针附加到userdata对象上。
或者,对于推送轻用户数据的情况
我的原始想法是使用轻量级userdata,但是根据我所读到的这里,所有轻量级userdata共享一个公共的元表。这并不理想,因为它会强制所有C端对象具有共同的行为。
考虑到我希望为Lua分配的对象重用元表,并简单地将不同的this指针传递给元方法,我的第二个想法涉及将人工this指针附加到userdata对象上。
struct ud
{
struct T* ptr;
struct T data;
};
struct ud* p = (struct ud*)lua_newuserdata(L, sizeof(struct ud));
p->ptr = &(p->data);
或者,对于推送轻用户数据的情况
struct T object;
struct T** p = (struct T**)lua_newuserdata(L, sizeof(struct T*));
*p = &object;
是否推荐使用附加“this指针”,或者有没有更符合API的替代方案?我的最终目标仅仅是将现有指针推送到Lua,并以这样一种方式关联一个元表,即元表可以重复用于重型和轻型用户数据。
void*
进行指针算术运算。那么,你想让你的第一个代码示例做什么? - Nicol Bolas