2010-07-18 3 views
-1

Je suis en train de construire simple entité/système de composants en C++ base de la deuxième réponse à cette question: Best way to organize entities in a game?mapping class à l'instance

Maintenant, je voudrais avoir un std statique :: carte qui retourne (et même créer automatiquement, si possible).

Ce que je pense est quelque chose le long des lignes de:

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

Quelle serait la meilleure façon d'y parvenir?

+0

statique est mauvais, mmkay? – Puppy

+0

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

+0

PositionComponent est un vecteur de position? – Albert

Répondre

1

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.

+0

Je me demande si bmargulies pense qu'une personne saine d'esprit l'utiliserait. – sharvey

+0

Eh bien, je n'ai jamais vu d'usecase où j'avais besoin de mapper des classes à quelque chose. :) Mais au cas où vous voulez faire cela, je pense qu'il n'y a rien de mal à cette solution. Ou est-ce? Cela devrait être parfaitement valide C++. Et c'est aussi efficace. – Albert

+0

Aussi efficace que l'utilisation de constantes? – sharvey

1

Vous devez créer des constantes (par exemple, POSITION_COMPONENT = 1), puis mapper ces entiers aux instances.

+0

Merci pour la réponse, mais y a-t-il un moyen d'éviter de créer des constantes comme ça? – sharvey

+0

Pourquoi ne voulez-vous pas utiliser des constantes? – Maz

+0

Venant de Python/javascript/..., je ne les trouve pas particulièrement élégants. Pas que ce soit une raison valable pour les éviter :) – sharvey