如何将全局 std::map 添加到 chaiscript?

How can I add a global std::map to chaiscript?

我想将 std::map 传递给 chaiscript。但是,我不确定该怎么做。我的代码目前如下:

#include <map>
#include <string>
#include <chaiscript/chaiscript.hpp>

int main(int argc, char* argv[]) {
    chaiscript::ChaiScript chai;
    auto data = std::map<std::string, std::string>{
        { "key1", "val1"},
        { "key2", "val2"},
    };
    chai.add_global(chaiscript::var(&data), "data");
    chai.eval(R"(
        print(data["key1"]);
    )");
}

但是,此代码崩溃并出现异常,即 chaiscript 不知道如何处理方括号 [] 运算符。我该如何解决这个问题?

我可以告诉 chaiscript 正确的函数是什么,但我更喜欢它,如果地图与 chaiscripts 内部兼容Map类型!

更新:

我在文档中找到了一点,其中解释了 chaiscript 映射类型支持任意输入。看代码,这好像是Boxed_Value类型做的。然而,这可能意味着根本不可能直接将 std::map 插入到脚本中。

我现在正在考虑要么写一个自定义类型,要么一个转换函数来解决问题。随时通知您...

据我所知,开箱即用的-chaiscript 只为您提供std::map<std::string,chaiscript::Boxed_Value> 地图类型。因此,如果您想将自己的地图添加到脚本中,您需要为 chaiscript 提供一种新类型,或者转换为给定的类型。因此,我看到以下解决方案:

情况一:只需要从chaiscript中取出一张map到c++

这个案例可以在文档中找到。你需要提供一个转换函数,然后就可以了。

chai.add(chaiscript::map_conversion<std::map<std::string, std::string>>());
auto map = chai.boxed_cast<std::map<std::string, std::string>>(chai.eval("data"));

情况 2:您只需要从 c++

提供到 chaiscript 的映射

这与案例1基本相同,但你必须自己提供转换函数。

auto convert = [](const std::map<std::string, std::string>& std_map) {
    auto chai_map = std::map<std::string, chaiscript::Boxed_Value>{};
    for (auto&& entry : std_map)
        chai_map.emplace(entry.first, chaiscript::var(entry.second));
    return chai_map;
};
chai.add(chaiscript::var(convert(data)),"data");

案例 3:您想在 chaiscript 和 c++

之间共享一个全局值

这个案子比较棘手。您要么必须为 chaiscript 提供 get_map() 和 send_map() 函数,它们处理数据同步:

chai.eval(R"(
    data = get_map();
    data["key1"] = "val1";
    send_map(data);
)");

或者您必须添加一个自定义数据类型,它在后台处理同步。

我的解决方案:

幸运的是,对于我的情况,我真的不需要 chaiscript 和 c++ 之间的共享状态,因此可以依赖 案例 2[ 的解决方案=50=].