0

我想将 a 传递std::mapchaiscript。但是,我不确定如何执行此操作。我的代码目前如下:

#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正确的功能是什么,但我更喜欢它,如果地图与chaiscript的内部Map类型兼容!

更新:

我在文档中找到了一点,它解释了chaiscript映射类型支持任意输入。查看代码,这似乎是由Boxed_Value类型完成的。但是,这可能意味着根本不可能直接插入std::map到脚本中。

我现在正在考虑编写自定义类型或转换函数来解决问题。让你知道...

4

1 回答 1

0

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

案例1:你只需要从chaiscript到c++中取出一个map

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

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++ 之间的共享状态,因此可以依赖Case 2的解决方案。

于 2018-07-13T11:06:33.503 回答