2

我刚刚发现了 chaiscript,我非常喜欢它。现在我想添加对我非常简单的 opengl 3d 引擎的支持。

我有 C++ 数学类:vec2T、vec3T、vec4T、mat2T、mat3T、mat4T、...(它们实际上是模板类,并且有 typedef 使它们成为 vec4i、vec4f、vec4d、...)

我想我可以将它们添加到 chaiscript 中:

chai.add(chaiscript::user_type<vec4i>(), "vec4i");

正确的?

现在,我想测试我的脚本是否包含一个名为“onFrame”的函数。如果是,我希望使用 vec4i 参数作为其第一个参数来调用它。我该怎么做呢?

我知道我可以做这样的事情:

try
{
    chai("onFrame();");
}
catch (const std::exception &)
{
}

如果脚本中未定义 onFrame,则这种方式将忽略异常。我什至可以通过这种方式传递一些整数或字符串参数。但是我如何继续将 vec4(x, y, z, w) 参数传递给它?

任何帮助表示赞赏!

4

1 回答 1

3

这里似乎实际上有几个问题。

您可以将类型名称添加到 ChaiScript 中,user_type但您仍然需要添加您想要使用的任何方法。

既然您提到它们是模板化类型,我建议您在您身边添加一个模板化函数,以便添加您想要的每个模板实例化。

是的,您是正确的,捕获异常会默默地忽略函数不存在。然而,在实践中,如果你真的在每一帧上都这样做,你的运行时间就会受到影响。抛出/捕获异常是昂贵的。

对于如何将 vec4i 对象传递给函数,您有很多选择。例如,您想从 C++ 还是在 ChaiScript 内部进行?

一种选择是从 C++ 以强类型的方式进行

auto func = chai.eval<std::function<void (const vec4i &)>>("onframe");
func(somevector);

我建议查看备忘单,看看它是否回答了剩下的问题。

于 2016-02-13T13:17:52.487 回答