如何检查函数是否在 chaiscript 中定义以及如何使用类型化参数执行它?
How can I check if a function is defined in the chaiscript and how can I execute it with typed arguments?
我刚刚发现了 chaiscript,我非常喜欢它。
现在我想添加对我非常简单的 opengl 3d 引擎的支持。
我有 C++ 数学-类: vec2T, vec3T, vec4T, mat2T, mat3T, mat4T, ...(它们实际上是模板 类 并且有使它们成为 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) 参数传递给它呢?
感谢任何帮助!
这里好像有几个问题。
您可以使用 user_type
将类型名称添加到 ChaiScript,但您仍然需要添加任何要使用的方法。
既然你提到它们是模板化类型,我建议在你这边添加一个模板化函数,以便为你添加你想要的每个模板实例化。
是的,您是正确的,捕获异常会默默地忽略不存在的函数。然而,在实践中,如果你真的在每一帧上都这样做,你的运行时间将会受到影响。 throw/catch 异常是昂贵的。
对于如何将 vec4i 对象传递给函数,您有很多选择。例如,您想从 C++ 还是在 ChaiScript 内部执行此操作?
一种选择是从 C++ 中以强类型的方式进行
auto func = chai.eval<std::function<void (const vec4i &)>>("onframe");
func(somevector);
我建议查看 cheatsheet 看看它是否回答了剩余的问题。
我刚刚发现了 chaiscript,我非常喜欢它。 现在我想添加对我非常简单的 opengl 3d 引擎的支持。
我有 C++ 数学-类: vec2T, vec3T, vec4T, mat2T, mat3T, mat4T, ...(它们实际上是模板 类 并且有使它们成为 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) 参数传递给它呢?
感谢任何帮助!
这里好像有几个问题。
您可以使用 user_type
将类型名称添加到 ChaiScript,但您仍然需要添加任何要使用的方法。
既然你提到它们是模板化类型,我建议在你这边添加一个模板化函数,以便为你添加你想要的每个模板实例化。
是的,您是正确的,捕获异常会默默地忽略不存在的函数。然而,在实践中,如果你真的在每一帧上都这样做,你的运行时间将会受到影响。 throw/catch 异常是昂贵的。
对于如何将 vec4i 对象传递给函数,您有很多选择。例如,您想从 C++ 还是在 ChaiScript 内部执行此操作?
一种选择是从 C++ 中以强类型的方式进行
auto func = chai.eval<std::function<void (const vec4i &)>>("onframe");
func(somevector);
我建议查看 cheatsheet 看看它是否回答了剩余的问题。