如何使用 LuaBind 将 std::map 绑定到 Lua

Mah*_*nGM 3 c++ lua stl luabind

我试图将我的std::map<std::string, std::string>作为类属性公开给 Lua。我已经为我的 getter 和 setter 设置了这个方法:

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;
}
Run Code Online (Sandbox Code Playgroud)

这样我就可以在 Lua 中做这样的事情:

player.scripts["movement"].properties["stat"] = "idle"
print(player.scripts["movement"].properties["stat"])
Run Code Online (Sandbox Code Playgroud)

但是,我在 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
Run Code Online (Sandbox Code Playgroud)

这些是SetMetaGetMetaFakeScript

static void GetMeta();
static void SetMeta();
Run Code Online (Sandbox Code Playgroud)

以前我是为 getter 方法这样做的:

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;
}
Run Code Online (Sandbox Code Playgroud)

这工作正常,但它不允许我使用 setter 方法。例如:

player.scripts["movement"].properties["stat"] = "idle"
print(player.scripts["movement"].properties["stat"])
Run Code Online (Sandbox Code Playgroud)

在这段代码中,它只会在两行中触发 getter 方法。虽然如果它让我使用 setter,我将无法从它["stat"]在这里的属性中获取密钥。

这里有关于 LuaBind 的专家吗?我见过大多数人说他们以前从未使用过它。

Obe*_*ron 5

您需要使用(未记录的)make_function()从函数中创建对象。

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

不幸的是,这个(简单的)过载make_function被打破,但你只需要插入 f作为第二个参数make_function.hpp