2017-11-21 15 views
3

IはCで次の簡単なコードを有する++オブジェクトは、STDの容器である:C++/Lua FFIを使用して、ユーザーデータをテーブルとして表示しますか?

local obj = create_an_object() 
print(obj.foo) -- 123 

一方print(obj)示す:上記FFIと

static int create_an_object(lua_State* L) { 
    auto obj = static_cast<Object*>(lua_newuserdata(L, sizeof(Object*))); 
    *obj = another_valid_obj; 

    luaL_newmetatable(L, "object_metatable"); 
    lua_pushcfunction(L, object_metatable_function); 
    lua_setfield(L, -2, "__index"); 
    lua_pop(L, 1); 
    return 1; 
} 

static int object_metatable_function(lua_State* L) { 
    string index = luaL_checkstring(L, -1); 
    if (index == "foo") { 
    lua_pushnumber(L, 123); 
    } 
    // Handles other indices, or throws error. 
} 

lua_pushcfunction(L, create_an_object); 
lua_setglobal(L, "create_an_object"); 

、IのようなLuaのオブジェクトの索引付けを達成することができますそのobjはuserdata: 0x12345678です。

objをテーブルとして使用できるように、一部のメタメソッドMagicを使用できますか?print(obj.foo)はまだ123を出力しますか?私はLua 5.1で自分のコードを実行しています。

答えて

0

"テーブルとして使うことができます"とはどういう意味なのでしょうか?print(obj)から違うものを印刷する場合は、__tostring metamethodを割り当ててからいくつかの文字列を返す必要がありますそれ。必要ならばこの文字列は"userdata: 0x12345678 = {foo = 123}"(または単に"{foo = 123}")のように見えるかもしれません。

新しいインデックスを割り当てるときにテーブルとして機能させることを意味する場合は、__newindex metamethodを使用する必要があります。

+0

私は、このユーザーデータの索引、ipair/pair繰り返しとgetlen(#)を含む操作をサポートしたいと考えています。 – TangKe

+0

これを実現するには、 '__pairs' /' __ipairs'メタメソッド(Lua 5.2+)と['__len'メタメソッド(https://www.lua.org/manual/5.2/manual.html#3.4.6) 。 –

+0

ええ、私はそれが5.2+で実行可能であることを知っていますが、私は5.1しか使用できません:( – TangKe

関連する問題