Может быть, это?
std::map< std::type_info*, Something > systems;
Тогда вы можете сделать:
Something sth = systems[ &typeid(PositionComponent) ];
Просто из любопытства я проверил ассемблерный код этого кода C ++
#include <typeinfo>
#include <cstdio>
class Foo {
virtual ~Foo() {}
};
int main() {
printf("%p\n", &typeid(Foo));
}
чтобы быть уверенным, что это действительно константа. Ассемблер (раздетый), выведенный GCC (без каких-либо оптимизаций):
.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
Так что на самом деле он должен читать символ L__ZTI3Foo$non_lazy_ptr
(интересно, хотя это не константа - возможно, с другими параметрами компилятора или с другими компиляторами, это так). Таким образом, константа может быть немного быстрее (если компилятор видит ее во время компиляции), потому что вы сохраняете чтение.