C ++クラスのLuaバインディングを作成する場合、テーブルまたはuserdataオブジェクトを返す必要がありますか?
それぞれの方法の長所と短所を知っている人はいますか?
C ++クラスのLuaバインディングを作成する場合、テーブルまたはuserdataオブジェクトを返す必要がありますか?
それぞれの方法の長所と短所を知っている人はいますか?
ユーザーデータを返すことをお勧めします。アプローチに関係なく、C ++データ、または実際のC ++データ自体へのポインターを配置する場所が必要であり、テーブルを使用してこれを行うのに安全な場所はありません。
テーブルを返すことは、状況によっては意味があります。これをサポートするために特別なことをしなくても、Luaで追加の属性を使用して「注釈」を付けることができるからです。残念ながら、C ++オブジェクトポインタはどこかに移動する必要があり、テーブル自体の実際のエントリ以外に移動するのが賢明な場所はありません。
これは、移動するのに非常に安全な場所ではありません。それはLuaコードによって見つけられ、削除または置換されます。これは偶然である可能性がありますが、意図的には問題ではありません。
したがって、私の好みはuserdataオブジェクトを返すことです。本当にそれを主張しなければならない場合は、テーブルのように機能させることができますが、C ++オブジェクトポインターを格納できる「秘密の」領域(実際のユーザーデータ自体)もあり、Luaコードによる上書きから安全です。
(Userdataオブジェクトには、オブジェクト固有のデータを格納する別の場所である「環境」ポインターもあります。userdataペイロード自体と同様に、この値はLuaコードにアクセスできず、その方法で損傷することはありません。)