You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ChaiScript中使用包含自定义对象的std::vector?

解决ChaiScript中暴露自定义对象std::vector时的异常问题

问题根源

你遇到的异常核心原因有两点:

  1. ChaiScript未识别std::vector<TestClass>类型,也未注册该类型的size()成员函数,导致脚本调用list.size()时无法解析方法。
  2. 你传递的是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:33:23