Je recherche une solution pour appeler la fonction virtuelle de façon dynamique. Cela signifie prendre en charge les appels de fonction avec des décalages et des types dynamiques lors de l'exécution.C++: Appel de fonction virtuelle dynamique
Je travaille sur un plugin pour un jeu (Counter-Strike: Source, si vous le savez). L'interface du plugin est peu probable et vous ne pouvez donc pas étendre autant que la plupart des gens le souhaitent. Pour réaliser une meilleure façon de communiquer et de manipuler le jeu, je supporte l'appel de fonctions virtuelles. Par exemple, la classe CCSPlayer a ces méthodes:
Offset Name
...
201 CCSPlayer::Ignite()
...
205 CCSPlayer::CommitSuicide(bool Blah)
...
250 CCSPlayer::SomeFunctionWith2Params(int A1, float A2)
Passing ces décalages et le pointeur sur l'instance de cette classe à ma fonction actuelle (voir ci-dessous), je peux appeler cette fonction:
CBasePlayer *pPlayer = Players.Find("mike");
bool bResult = Call2<bool, int, float>(210 /* offset */, pPlayer, 20, 50.0f);
Je fais ceci pour appeler les fonctions virtuelles que je ne peux pas appeler à travers la routine normale parce que le compilateur ne connaît pas la structure de la classe CCSPlayer dérivée.
Et maintenant je veux ajouter un langage de script avec des appels de fonctions virtuelles dynamiques. Cela signifie que les scripteurs peuvent définir la quantité de params, et de quel type ils sont. Puis en passant le this-pointeur et le décalage à la fonction, pour finalement l'exécuter. C'est mes vraies questions.
Actuellement, je ne peux que coder en dur ceux-ci en utilisant des modèles et en créant une fonction pour chaque quantité de paramètres. Exemple:
template<typename T, typename A, typename B> T Call2(int iOffset, void *pThis, A arg1, B arg2)
{
void **pVTable = *(void***)pThis;
void *pPointer = pVTable[_iOffset];
union
{
T (CVCallEmpty::*pCall)(A, B);
void *pAddress;
} Data;
Data.pAddress = pPointer;
return (reinterpret_cast<CVCallEmpty*>(*(void***)&pThis)->*Data.pCall)(arg1, arg2);
}
Maintenant, est-il possible de prendre en charge les appels dynamiques?
Pas de méthode primitive – Sheen
Pourriez-vous expliquer ce que vous voulez dire en appelant dynamiquement des fonctions virtuelles? ? Le code a l'air horrible. –
Quelle est la raison de ce überhack? Qu'essayez-vous vraiment de faire? – Dialecticus