如何检查chaiscript中是否定义了函数以及如何使用类型参数执行它?

时间:2016-02-10 09:14:43

标签: c++ chaiscript

我刚刚发现了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)参数?

感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

这里似乎有几个问题。

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

由于您提到它们是模板化类型,我建议您添加一个模板化函数,以便为您添加每个模板实例化。

是的,你是正确的,捕获异常会默默地忽略一个函数不存在。但是,在实践中,如果您在每个帧上实际执行此操作,您的运行时将受到影响。抛出/捕获异常是很昂贵的。

关于如何将vec4i对象传递给函数,您有很多选择。你想用C ++或ChaiScript内部吗?

一种选择是从C ++

以强类型方式进行
auto func = chai.eval<std::function<void (const vec4i &)>>("onframe");
func(somevector);

我建议查看cheatsheet以查看是否能回答剩下的问题。