代码之家  ›  专栏  ›  技术社区  ›  sharvey

将类映射到实例

  •  -1
  • sharvey  · 技术社区  · 16 年前

    我试图在这个问题的第二个答案的基础上,用c++构建一个简单的实体/组件系统: Best way to organize entities in a game?

    现在,我希望有一个返回的静态std::map(如果可能的话,甚至可以自动创建)。

    我的想法大致如下:

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

    实现这一目标的最佳方法是什么?

    2 回复  |  直到 9 年前
        1
  •  1
  •   Albert    16 年前

    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 symbol(我想知道这不是常量——可能是其他编译器选项或其他编译器的常量)。因此常数可能会稍微快一点(如果编译器在编译时看到该常数),因为您保存了一个读取。

        2
  •  1
  •   Maz    16 年前

    您应该创建一些常量(例如POSITION\u COMPONENT=1),然后将这些整数映射到实例。