Как вызвать конструктор с помощью std :: initializer_list типа пользователя в ChaiScript?

У меня есть следующий класс определения:

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);

script1 а также script2 бегать без проблем, но script3 дай мне следующую ошибку выполнения:

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

Как правильно называть конструктор MyType(std::initializer_list<MyType>) из ChaiScript?

0

Решение

В ChaiScript нет способа зарегистрировать функцию с переменным числом аргументов, необходимо зарегистрировать функцию для каждой возможной комбинации аргументов и не может создать список фигурных скобок, такой как 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 за:

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

Test3();
)"";
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector