我想将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 正确的功能是什么,但是如果地图与 chaiscript 内部的Map
类型兼容,我会更喜欢它!< / p>
更新:
我在文档中发现了一些内容,这说明 chaiscript 映射类型支持任意输入。查看代码,这似乎是由Boxed_Value
类型完成的。但是,这可能意味着从根本上不可能直接将std::map
插入脚本。
我现在正在考虑编写自定义类型或转换函数来解决问题。保持发布状态...
答案 0 :(得分:0)
据我所知,现成的 chaiscript 仅为您提供std::map<std::string,chaiscript::Boxed_Value>
地图类型。因此,如果要将自己的地图添加到脚本中,则需要为 chaiscript 提供新的类型,或转换为给定的类型。因此,我看到以下解决方案:
案例1:您只需要获取一张从 chaiscript 到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 的解决方案。