Peut-être que cela?
std::map< std::type_info*, Something > systems;
Ensuite, vous pouvez faire:
Something sth = systems[ &typeid(PositionComponent) ];
Juste par curiosité, j'ai vérifié le code assembleur de ce code C++
#include <typeinfo>
#include <cstdio>
class Foo {
virtual ~Foo() {}
};
int main() {
printf("%p\n", &typeid(Foo));
}
pour être sûr qu'il est vraiment une constante. Assembleur (dénudée) délivrée par GCC (sans Optimisations):
.globl _main
_main:
LFB27:
pushl %ebp
LCFI0:
movl %esp, %ebp
LCFI1:
pushl %ebx
LCFI2:
subl $20, %esp
LCFI3:
call L3
"L00000000001$pb":
L3:
popl %ebx
leal L__ZTI3Foo$non_lazy_ptr-"L00000000001$pb"(%ebx), %eax
movl (%eax), %eax
movl %eax, 4(%esp)
leal LC0-"L00000000001$pb"(%ebx), %eax
movl %eax, (%esp)
call _printf
movl $0, %eax
addl $20, %esp
popl %ebx
leave
ret
Il a fait de lire le symbole L__ZTI3Foo$non_lazy_ptr
(je me demande bien que ce n'est pas constante - peut-être avec d'autres options du compilateur ou avec d'autres compilateurs, c'est). Donc une constante peut être légèrement plus rapide (si le compilateur voit la constante au moment de la compilation) parce que vous enregistrez une lecture.
statique est mauvais, mmkay? – Puppy
Je suis d'accord, mais supposons que ce n'est pas statique. Y a-t-il un moyen de mapper les classes aux instances? – sharvey
PositionComponent est un vecteur de position? – Albert