2016-02-10 1 views
2

Je viens de découvrir chaiscript et je l'aime beaucoup. Maintenant, je veux ajouter un support pour mon moteur 3D opengl très simple.Comment puis-je vérifier si une fonction est définie dans le chaiscript et comment puis-je l'exécuter avec des arguments typés?

Je mathématiques classes C de: vec2T, vec3T, vec4T, mat2T, mat3T, mat4T, ... (ce sont des classes réellement modèles et il y a des typedefs qui les rendent vec4i, vec4f, vec4d, ...)

Je pense que je peux les ajouter à chaiscript avec:

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

droit?

Maintenant, je veux tester si mon script contient une fonction appelée "onFrame". Si c'est le cas, je veux qu'il soit appelé avec un paramètre vec4i comme premier argument. Comment est-ce que je fais ceci?

Je comprends que je peux faire quelque chose comme ceci:

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

Si onFrame n'est pas défini dans le script, l'exception sera ignorée cette façon. Je peux même passer des paramètres entiers ou des chaînes de cette façon. Mais comment passer un paramètre vec4 (x, y, z, w)?

Toute aide est appréciée!

Répondre

3

Il semble y avoir plusieurs questions ici.

Vous pouvez ajouter le nom de type à ChaiScript avec user_type mais vous devrez toujours ajouter l'une des méthodes que vous souhaitez utiliser. Puisque vous mentionnez qu'il s'agit de types de modèles, je suggère d'ajouter une fonction de modèle de votre côté qui permet d'ajouter chaque instanciation de modèle que vous voulez pour vous.

Oui, vous avez raison de remarquer que l'interception de l'exception ignore silencieusement qu'une fonction n'existe pas. Cependant, dans la pratique, si vous le faites littéralement sur chaque image, votre exécution en souffrira. Il est coûteux de lancer/attraper des exceptions.

Vous disposez de nombreuses options pour transmettre votre objet vec4i à la fonction. Voulez-vous le faire à partir de C++ ou à l'intérieur de ChaiScript par exemple?

Une option est de le faire d'une manière fortement typé de C++

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

Je suggère à la recherche sur le cheatsheet pour voir si elle répond à des questions restantes.

+0

Merci. Je n'avais pas remarqué qu'il y avait une feuille de triche. Y a-t-il un lien sur le site? – scippie

+0

@scippie vient de l'ajouter à la page principale. – lefticus