3

std::map<std::string, std::string>myをクラス プロパティとして Luaに公開しようとしています。ゲッターとセッターにこのメソッドを設定しました:

luabind::object FakeScript::GetSetProperties()
{
    luabind::object table = luabind::newtable(L);
    luabind::object metatable = luabind::newtable(L);

    metatable["__index"] = &this->GetMeta;
    metatable["__newindex"] = &this->SetMeta;

    luabind::setmetatable<luabind::object, luabind::object>(table, metatable);

    return table;
}

このようにして、Lua で次のようなことができるようになります。

player.scripts["movement"].properties["stat"] = "idle"
print(player.scripts["movement"].properties["stat"])

ただし、C++ で提供したコードはコンパイルされません。metatable["__index"] = &this->GetMeta;この行とその次の行に、オーバーロードされた関数へのあいまいな呼び出しがあることがわかります。これを正しく行っているかどうかはわかりません。

エラーメッセージ:

error C2668: 'luabind::detail::check_const_pointer' : 
ambiguous call to overloaded function
c:\libraries\luabind-0.9.1\references\luabind\include\luabind\detail\instance_holder.hpp    75

これらは次SetMetaのとおりですGetMetaFakeScript

static void GetMeta();
static void SetMeta();

以前は、ゲッターメソッドに対してこれを行っていました:

luabind::object FakeScript::getProp()
{
    luabind::object obj = luabind::newtable(L);

    for(auto i = this->properties.begin(); i != this->properties.end(); i++)
    {
        obj[i->first] = i->second;
    }

    return obj;
}

これは問題なく動作しますが、setter メソッドを使用できません。例えば:

player.scripts["movement"].properties["stat"] = "idle"
print(player.scripts["movement"].properties["stat"])

このコードでは、両方の行で getter メソッドをトリガーするだけです。セッターを使用できるようにすると、ここにあるプロパティからキーを取得できなくなり["stat"]ます。

ここにLuaBindの専門家はいますか? ほとんどの人が、これまでにそれを使ったことがないと言っているのを見てきました。

4

1 に答える 1

5

make_function()関数からオブジェクトを作成するには、(文書化されていない) を使用する必要があります。

metatable["__index"] = luabind::make_function(L, &this->GetMeta);
metatable["__newindex"] = luabind::make_function(L, &this->GetMeta);

残念ながら、この (最も単純な) のオーバーロードは壊れていますが、 の 2 番目のパラメーターとして挿入する make_function必要があるだけです。fmake_function.hpp

于 2013-07-18T17:02:04.807 に答える