Отображение класса на экземпляр - PullRequest
0 голосов
/ 18 июля 2010

Я пытаюсь построить простую систему сущностей / компонентов на основе c ++ на втором ответе на этот вопрос: Лучший способ организовать сущности в игре?

Теперь яхотел бы иметь статический std :: map, который возвращает (и даже автоматически создает, если это возможно).

Я думаю, что-то вроде:

PositionComponent *pos = systems[PositionComponent].instances[myEntityID];

Каков наилучший способ достичь этого?

Ответы [ 2 ]

1 голос
/ 18 июля 2010

Может быть, это?

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 (интересно, хотя это не константа - возможно, с другими параметрами компилятора или с другими компиляторами, это так). Таким образом, константа может быть немного быстрее (если компилятор видит ее во время компиляции), потому что вы сохраняете чтение.

1 голос
/ 18 июля 2010

Вы должны создать несколько констант (например, POSITION_COMPONENT = 1) и затем отобразить эти целые числа в экземпляры.

...