如何将全局 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=].
我想将 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=].