2017-08-27 1 views
1

Le système d'assurance-chômage dans mon programme fonctionne actuellement en assignant des pointeurs de fonction du type void(*)() à éléments déclencheurs (quads sur l'écran, les touches du clavier) avec un définissable appeler la condition qui sera comparée à l'état réel de la clé (en utilisant GLFW), le bouton de la souris ou le curseur à chaque image pour déterminer si la fonction de rappel doit être appelée. Une condition pour une clé peut être KeyCondition(PRESS, LEFT_SHIFT) qui appelle le rappel lié à la touche si la touche a été enfoncée pendant que le décalage vers la gauche est maintenu enfoncé.C++ - de façon efficace et efficiente de lier des fonctions aux éléments déclencheurs

Mon problème est que je peux seulement assigner ces boutons fonctions du type void(*)(), ce qui me empêche de passer des arguments à un rappel de bouton. Si par exemple je voulais allumer un bouton quand le curseur le survole, je devrais créer une fonction désignée void highlightButtonA() qui met la couleur du bouton A à une valeur plus élevée en interne, alors que je préférerais bien sûr pouvoir pour définir le rappel à quelque chose comme void offsetColor(unsigned int buttonIndex, float r, float g, float b, float a) et passer des paramètres individuels à chaque rappel.

Y at-il un moyen de le faire? Y at-il un pointeur de fonction qui peut pointer vers une fonction de n'importe quelle forme et va stocker des paramètres en quelque sorte? Combien dois-je m'inquiéter de la performance de ces solutions? Mon programme doit être capable de gérer plusieurs pressions de touche/bouton par seconde tout en restant stable, car c'est un jeu de tir rapide.

+1

Avez-vous envisagé d'utiliser Qt? Ils ont un système de [signaux et slots] (https://doc.qt.io/qt-4.8/signalsandslots.html) qui est très bien adapté pour les fonctions de liaison aux déclencheurs. – CoryKramer

+0

Cela ressemble à vous cherchez des lambdas C++ 11 et C++ 14 avec des fermetures qui contiennent vos variables. –

+0

@CoryKramer Un emplacement Qt n'est-il pas identique à un pointeur de fonction? Il dit qu'ils sont des fonctions membres mais pour stocker les connexions entre les signaux et les slots, j'imagine que vous devez stocker un pointeur sur la fonction. – stimulate

Répondre

2

Vous pouvez utiliser lambdas non-capture qui se désintègrent à des pointeurs de fonction, quelque chose comme ceci:

button.OnMouseHover([]{ offsetColour(buttonIndex, r, g, b, a); }); 

se rappeler juste que buttonIndex et d'autres args à offsetColour devraient être littéraux comme lambda ne peut pas capturer les variables de la portée englobante .

+0

Y a-t-il une raison pour laquelle le lambda ne peut capturer aucune variable? – stimulate

+1

car la capture de lambda ne peut pas se désintégrer au pointeur de fonction, car c'est un objet statefull maintenant (pour stocker les variables capturées) –