如何使用Chaiscript中用户类型的std :: initializer_list调用构造函数

How call a constructor with std::initializer_list of a user type in ChaiScript?

本文关键字:initializer list 构造函数 调用 std Chaiscript 何使用 用户 类型      更新时间:2023-10-16

我有下一个定义类:

class MyType {
public:
    MyType();
    MyType(int x);
    MyType(std::initializer_list<MyType> list);
}

我在Chaiscript v6.0.0中注册我的自定义类及其构造函数如下:

chai.add(chaiscript::user_type<MyType>(), "MyType");
chai.add(chaiscript::constructor<MyType()>(), "MyType");
chai.add(chaiscript::constructor<MyType(int)>(), "MyType");
chai.add(chaiscript::constructor<MyType(std::initializer_list<MyType>)>(), "MyType");

我有下一个脚本:

std::string script1 = R""(
    def Test1() {
        var m = MyType();
    }
    Test1();
)"";
auto res = chai.eval<MyType>(script1);

std::string script2 = R""(
    def Test2() {
        var m = MyType(10);
    }
    Test2();
)"";
auto res2 = chai.eval<MyType>(script2);

std::string script3 = R""(
    def Test3() {
        var m = MyType({10, 20});
    }
    Test3();
)"";
auto res3 = chai.eval<MyType>(script3);

script1script2没有问题运行,但是script3给我下一个执行错误:

Error: "Incomplete equation" during evaluation  at (9, 14)

从chaiscript调用构造函数MyType(std::initializer_list<MyType>)的正确方法是什么?

chaiscript没有办法注册variadic函数,这是必要的注册参数组合的函数,并且不能像C 这样生产带有括号的纳入列表。

我发现的解决方法是添加接收向量的MyType的构造函数:

class MyType {
public:
    MyType();
    MyType(int x);
    MyType(std::initializer_list<MyType> list);
    MyType(const std::vector<MyType>& v);
}

在Chaiscript v6.0.0中注册我的自定义类及其构造函数如下:

chai.add(chaiscript::user_type<MyType>(), "MyType");
chai.add(chaiscript::constructor<MyType()>(), "MyType");
chai.add(chaiscript::constructor<MyType(int)>(), "MyType");
chai.add(chaiscript::constructor<MyType(const std::vector<MyType>&)>(), "MyType");

和更改 script3 for:

std::string script3 = R""(
    def Test3() {
        var m = MyType([MyType(10), MyType(20)]);
    }
    Test3();
)"";