Προς το περιεχόμενο

[C++] Store parameter pack και πέρασμα σε variadic template function


Kercyn

Προτεινόμενες αναρτήσεις

  • Moderators

Καλημέρα σας.

 

Έχω μια εφαρμογή γραμμένη σε C++, η οποία δίνει ένα API το οποίο χρησιμοποιείται από ένα Lua script και θέλω να δίνω στο συντάκτη του Lua script τη δυνατότητα να καλεί συναρτήσεις με τον εξής τρόπο:

Σε ένα τρίτο πρόγραμμα, ο χρήστης συμπληρώνει πεδία με κλειδιά και τιμές. Στο κλειδί Function γράφει το όνομα της συνάρτησης του script που θέλει να καλέσει. Για κάθε παράμετρο του function, ο χρήστης γράφει για κλειδί arg_<αύξων αριθμός arg>_<type> και στη συνέχεια την τιμή της παραμέτρου. Ο τύπος μπορεί να είναι std::string, int, float και bool.

 

Τα πεδία αυτά είναι σταθερά και δεν αλλάζουν κατά τη διάρκεια εκτέλεσης της εφαρμογής. Αυτά τα πεδία θα διαβάζονται στο runtime σε άγνωστες στιγμές και θα πρέπει η εφαρμογή να καλεί το κατάλληλο function του script. Ιδανικά, θα ήθελα να μπορώ να διαβάζω όλα αυτά τα πεδία σε συγκεκριμένες στιγμές, να αποθηκεύω όλες τις παραμέτρους (τύπος - τιμή) του κάθε function "κάπου" και όταν χρειαστεί να καλώ το κατάλληλο function με τις κατάλληλες παραμέτρους.

 

Για να το κάνω λίγο πιο χειροπιαστό:

 

post-284325-0-74360000-1479258577_thumb.png

 

Στην εικόνα είναι το μέρος ενός χάρτη για ένα platformer game και έχει ένα κουτάκι EndLevel. Όταν ο παίκτης μπει μέσα σ' αυτό το κουτάκι, τότε ο μηχανισμός που πιάνει τα collisions θα πρέπει να ενημερώσει το μηχανισμό που είναι υπεύθυνος για την επικοινωνία C++ - Lua, ο οποίος θα πρέπει να καλέσει τη συνάρτηση ChangeLevel που βρίσκεται μέσα στο script, περνώντας ως παραμέτρους ένα string με τιμή "L2". Όπως καταλαβαίνετε, αυτός που φτιάχνει το script και το χάρτη μπορεί να βάλει όσες παραμέτρους διαφορετικού τύπου θέλει, και επειδή η Lua είναι dynamically typed θα πρέπει η C++ να κάνει τις απαραίτητες μετατροπές και να περάσει τις παραμέτρους με το σωστό τύπο και όχι όλα ως strings.

 

Πώς μπορώ εγώ να αποθηκεύσω κάπως από πριν τιμές και τύπο για κάθε τέτοιο κουτάκι και να καλώ τις συναρτήσεις όποτε χρειάζεται; Βρήκα αυτό, αλλά επειδή δεν είναι trivial θα ήθελα και μια δεύτερη σχεδιαστική ή/και τεχνική γνώμη πριν ξεκινήσω να το κάνω. Κοίταξα επίσης μήπως μπορώ να αποθηκεύω τις παραμέτρους σε κάνα vector από Boost.Variant αλλά διάβασα εδώ ότι δεν πολυγίνεται να περάσω τα στοιχεία ενός vector ως arguments σε variadic templates.

 

Αν δεν είναι πρακτικό να τις αποθηκεύω, φαντάζομαι ότι το να διαβάζω τα πεδία on demand δε θα είχε απαγορευτικό overhead (αν και θα ήθελα να το αποφύγω), αλλά και πάλι δεν ξέρω πώς ακριβώς θα καλούσα το function.

 

Υ.Γ.: Αν έχει σημασία, το signature του function που καλεί μια συνάρτηση σε ένα Lua script είναι αυτή (χρησιμοποιώ Selene):

template <typename... Args>

    const Selector operator()(Args... args) const
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...