我想通过一个std::map给链表。不过,我不知道该怎么做。我的代码目前如下:
#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_s内部Map类型兼容,我更喜欢它!
更新:
我在文档中找到了一点,这说明chaiscript映射类型支持任意输入。看一下代码,这似乎是由Boxed_Value类型完成的。然而,这可能意味着根本不可能直接将std::map插入脚本中。
我现在正在考虑编写一个自定义类型,或者一个转换函数来解决这个问题。随时通知你..。
发布于 2018-07-13 11:06:33
据我所见,开箱即用的链表只为您提供了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:您只需向 chaiscript 提供一张来自c++的地图
这与Case 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++之间共享一个全局值
这个案子相当棘手。您要么必须提供带有get_map()和send_map()函数的chaiscript,后者处理数据同步:
chai.eval(R"(
data = get_map();
data["key1"] = "val1";
send_map(data);
)");或者您必须添加一个自定义数据类型,它在后台处理同步。
我的解决方案:
幸运的是,我并不需要chaiscript和c++之间的共享状态,因此可以依赖于Case 2的解决方案。
https://stackoverflow.com/questions/51310365
复制相似问题