C 側から所有されているポインターがあり、ユーザーデータの形式で Lua スタックにプッシュしたいとします。特定のメタテーブルを指定する機能を犠牲にせずに、これを達成するための最良の方法は何でしょうか?
私の最初のアイデアは、軽いユーザーデータを使用することでしたが、ここで読んだことから、すべての軽いユーザーデータは共通のメタテーブルを共有しています。これは、すべての c-side オブジェクトに共通の動作を強制するため、望ましくありません。
別の this ポインターをメタメソッドに渡すだけで、Lua に割り当てられたオブジェクトのメタテーブルを再利用したいことを考慮して、私の 2 番目のアイデアは、人工的な this ポインターをユーザーデータ オブジェクトにアタッチすることでした。
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 にプッシュし、メタテーブルを重いユーザーデータと軽いユーザーデータの両方で再利用できるようにメタテーブルを関連付けることです。