2009-05-19 8 views
3

Je travaille sur un projet C++ avec un grand nombre de classes (150+), chacune ayant entre 10 et 300 champs. J'aimerais vraiment être en mesure de fournir une interface de script à des fins de test afin que je puisse coder des rappels qui ne nécessitent aucune recompilation. J'aimerais le faire dans Lua car je connais mieux son API C que Python, mais si cela permet de sauver des maux de tête, je serais heureux de le faire en Python.Passer des variables entre C++ et Lua via Swig

J'ai une bonne compréhension de la façon d'appeler les fonctions Lua de mon C++ et vice versa, et je sais comment transmettre les types de données de base d'avant en arrière. La question que j'ai est de savoir comment partager les types de données spécifiées par l'utilisateur entre les deux en utilisant SWIG. Par exemple, à un moment donné dans mon C++, je pourrais vouloir évaluer quelques données de membre dans un objet qui a 250 champs. J'aimerais pouvoir remettre cet objet à Lua qui pourrait alors utiliser les wrappers SWIG générés pour manipuler cet objet, afficher certains champs, puis passer l'objet (potentiellement changé) à C++ pour une utilisation continue .

Je voudrais aussi pouvoir instancier une instance de l'objet dans Lua en utilisant les wrappers et le passer en C++ pour être utilisé comme une version C++ normale de l'objet.

Est-ce possible? Quelqu'un pourrait-il me diriger vers un tutoriel ou un exemple explicite?

Merci pour toute aide que vous pouvez offrir!

Répondre

1

Tant que vous enveloppez vos types définis par l'utilisateur en utilisant des interfaces Swig (voir here pour la documentation sur l'API Swig-Lua), l'interaction doit être transparente. Les wrappers Swig fournis vous permettront d'instancier de nouveaux objets, de les transmettre à C++ et vice-versa.

Je ne crois pas que l'encapsulation Swig-Lua prenne encore en charge les classes Director, ce qui signifie qu'il n'est pas possible d'étendre les classes existantes, de les instancier et de les renvoyer en C++. Les directeurs sont supportés pour des langages tels que Python, Java, C#.

+0

Très bien, merci pour le lien! Même aller seulement dans un sens est une grande aide. Même si je ne peux pas créer une nouvelle instance d'un objet dans Lua et la renvoyer en C++, savez-vous si je peux * modifier * un objet C++ existant qui a été transmis à Lua? C'est-à-dire, puis-je créer un objet C++, le passer à Lua, modifier quelques champs dans Lua, puis recommencer à l'utiliser en C++ avec les champs mis à jour? – zslayton

+0

Oui, bien sûr. La modification de l'objet dans LUA (via l'interface fournie par SWIG) modifie réellement l'objet C++ sous-jacent. Tout est plutôt transparent. SWIG fait également du bon travail avec les fonctionnalités de langage telles que les tableaux, STL, les pointeurs, les fonctions de type usine et les interfaces de classe basées sur l'opérateur (y compris les pointeurs intelligents) – ASk

0

Si swig vous donne des problèmes, j'ai eu de la chance avec la dernière version de tolua ++, qui est dans le seul but de lier C++ et Lua. Il nécessite un fichier .h modifié en entrée, ce qui est un peu fastidieux, mais pas plus que les modules de Swig. Je n'ai aucune raison de préférer l'un à l'autre, mais c'est bon à savoir des deux.

0

Vous devriez également vérifier Luabind. Celui-ci implémente la POO pour Lua et peut mapper les classes et les types de données de Lua vers C++.

Questions connexes