Bonjour,
je cherchais un code pour obtenir dynamiquement le rang dans la VMT d'une méthode virtuelle, voila la solution que j'ai trouvée qui devrait marcher avec tous les compilateurs/processeurs :
je pense que le seul truc qui peut faire crasher c'est si le compilateur s'amuse à ne pas mettre dans la VMT les méthodes dans l'ordre de leur déclaration,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 // CPPVmtRank.cpp : dynamically obtain VMTRank from a pointer to a virtual method #define __Meth(N) virtual int DummyMethod##N() { return 0x##N; } #define __MethX(N) __Meth(N##0) __Meth(N##1) __Meth(N##2) __Meth(N##3) \ __Meth(N##4) __Meth(N##5) __Meth(N##6) __Meth(N##7) \ __Meth(N##8) __Meth(N##9) __Meth(N##A) __Meth(N##B) \ __Meth(N##C) __Meth(N##D) __Meth(N##E) __Meth(N##F) #define __MethXX(N) __MethX(N##0) __MethX(N##1) __MethX(N##2) __MethX(N##3) \ __MethX(N##4) __MethX(N##5) __MethX(N##6) __MethX(N##7) \ __MethX(N##8) __MethX(N##9) __MethX(N##A) __MethX(N##B) \ __MethX(N##C) __MethX(N##D) __MethX(N##E) __MethX(N##F) class DummyClass { public: __MethXX(0) __MethXX(1) __MethXX(2) __MethXX(3) __MethXX(4) __MethXX(5) __MethXX(6) __MethXX(7) __MethXX(8) __MethXX(9) __MethXX(a) __MethXX(b) __MethXX(c) __MethXX(d) __MethXX(e) __MethXX(f) ///4096 DummyMethods }; DummyClass dummyObj; class A { public: virtual void Meth0(); virtual void Meth1(); virtual void Meth2(); virtual void Meth3(); virtual void Meth4(); virtual void Meth5(); virtual void Meth6(); }; template <typename T> int GetVMTRank(T t) { int (DummyClass::*methPtr)(); *(void**)&methPtr = *(void**)&t; return (dummyObj.*methPtr)(); } int main() { int Meth0_VMTRank = GetVMTRank(&A::Meth0); int Meth6_VMTRank = GetVMTRank(&A::Meth6); }
dans ce cas il est possible de créer une DummyClass par DummyMethod (DummyClass9 héritant de DummyClass8) pour obliger le compilateur à mettre les DummyMethod dans l'ordre.
Partager