【问题标题】:How call a constructor with std::initializer_list of a user type in ChaiScript?如何在 ChaiScript 中使用用户类型的 std::initializer_list 调用构造函数?
【发布时间】:2017-04-17 20:08:40
【问题描述】:

我有下一个定义类:

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&lt;MyType&gt;) 的正确方法是什么?

【问题讨论】:

  • 注意:正确的 std::initializer_list&lt;&gt; 构造函数如下所示:MyType(std::initializer_list&lt;MyType&gt; list); 请参阅:en.cppreference.com/w/cpp/utility/initializer_list 另请参阅:stackoverflow.com/a/17803511/2296177
  • @user2296177 感谢格式建议。
  • @chema989:ChaiScript 有办法注册可变参数函数吗?如果没有,我看不到 ChaiScript 能够做到这一点的方法。所有initializer_list 实例最终都来自一个braced-init-list。这是一个 C++ 语法结构; ChaiScript 无法制造这样的东西。
  • @NicolBolas ChaiScript 没有办法注册可变参数函数,必须为每个可能的参数组合注册一个函数。

标签: c++ constructor c++14 chaiscript stdinitializerlist


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-07
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多