如何使用Chaiscript中用户类型的std :: initializer_list调用构造函数
How call a constructor with std::initializer_list of a user type in 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)
从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();
)"";
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- C++中带有List类的迭代器Segfault
- 使用"std::unordereded_map"映射到"std::list"对象
- GCC对可能有效的代码抛出init list生存期警告
- 使用std::list创建循环链表
- C2664 无法从'initializer list'转换参数
- 使用 std::min "no matching function for call to ‘min(<brace-enclosed initializer list>)’"时出错
- 在C++中标记化"Braced Initializer List"样式字符串(使用 Boost?
- "默认参数":无法从'initializer list'转换为'std::initializer_list'
- 无法从'initializer-list'转换为用户控制器
- 如何修复<function-style-cast>错误:无法从'initializer list'转换为asdending比较<W>(模板函子)
- 递归调用中出现错误"[Error] expression list treated as compound expression in initializer [-fpermissive]"
- VS2015无法从'initializer list'转换为'std::string'错误
- 编译器错误:"Non-aggregates cannot be initialized with initializer list."
- 无法转换...从 '<brace-enclosed initializer list>' 到 地图
- 无法将'<brace-enclosed initializer list>'转换为'double'作为回报
- <function-style-cast> 错误:无法从'initializer list'转换为'std::thread'
- initializer语言 - list不能转换为const margin *