如何在ChaiScript中使用包含自定义对象的std::vector?
解决ChaiScript中暴露自定义对象std::vector时的异常问题
问题根源
你遇到的异常核心原因有两点:
- ChaiScript未识别
std::vector<TestClass>类型,也未注册该类型的size()成员函数,导致脚本调用list.size()时无法解析方法。 - 你传递的是vector的指针,但脚本中使用
.访问成员,指针类型需用->,不过这并非根本问题,未完成类型注册才是触发崩溃的关键。
解决方案
需完成以下两步操作,再调整传递方式:
- 注册
std::vector<TestClass>的用户类型 - 注册该vector类型的
size()成员函数 - 传递vector的引用给ChaiScript(更符合常规使用场景)
修改后的完整代码
#include <iostream> #include <vector> #include <chaiscript/chaiscript.hpp> class TestClass { public: TestClass() {} ~TestClass() {} bool SomeVariable = true; }; int main() { std::vector<TestClass> bars(3); chaiscript::ChaiScript chai; // 注册TestClass类型及成员变量 chai.add(chaiscript::user_type<TestClass>(), "TestClass"); chai.add(chaiscript::fun(&TestClass::SomeVariable), "SomeVariable"); // 注册std::vector<TestClass>类型及size()方法 chai.add(chaiscript::user_type<std::vector<TestClass>>(), "VectorTest"); chai.add(chaiscript::fun(&std::vector<TestClass>::size), "size"); // 传递vector的引用给ChaiScript chai.add(chaiscript::var(std::ref(bars)), "list"); try { auto xx = chai.eval<int>("return list.size();"); printf("xx = %d\n", xx); } catch (const chaiscript::exception::eval_error& e) { std::cerr << "ChaiScript错误: " << e.what() << std::endl; } return 0; }
补充说明
如果坚持传递指针,只需将脚本中的list.size()改为list->size(),同时确保指针类型被正确处理,但传递引用更符合C++与ChaiScript交互的常规逻辑。添加try-catch块可以捕获并输出具体的ChaiScript错误信息,便于调试定位问题。
内容的提问来源于stack exchange,提问作者Erwin Beckers
相关产品推荐
相关产品推荐

