Как я могу проверить, определена ли функция в chaiscript и как я могу выполнить ее с типизированными аргументами?

Я только что открыл Chaiscript, и мне это очень нравится.
Теперь я хочу добавить поддержку моего очень простого трехмерного движка opengl.

У меня есть математические классы 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)?

Любая помощь приветствуется!

2

Решение

Здесь, кажется, на самом деле есть несколько вопросов.

Вы можете добавить имя типа в ChaiScript с помощью user_type но вам все равно нужно будет добавить любой из методов, которые вы хотите использовать.

Поскольку вы упоминаете, что они являются шаблонными типами, я бы предложил добавить шаблонную функцию на вашей стороне, которая позволяет добавлять каждый экземпляр шаблона, который вы хотите для себя.

Да, вы правы, что перехват исключения молча игнорировал бы то, что функция не существует. Однако на практике, если вы делаете это буквально на каждом кадре, ваша среда выполнения пострадает. Бросать / ловить исключения стоит дорого.

У вас есть много вариантов передачи вашего объекта vec4i в функцию. Вы хотите сделать это из C ++ или из ChaiScript, например?

Один из вариантов — сделать это строго типизированным способом из C ++.

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

Предлагаю посмотреть через шпаргалка чтобы увидеть, отвечает ли он на оставшиеся вопросы.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]