2009-11-07 12 views
6

Chciałbym móc rejestrować moje klasy w ramach std::map lub wektora, nie myśl o duplikatach i na razie, , ale nie chcę rejestrować ich w ramach wywołanie klasy konstruktora lub jakakolwiek funkcja w klasie, w jakiś sposób robimy to poza klasą, więc nawet jeśli nigdy go nie utworzę, będę w stanie wiedzieć, że istnieje.Jakoś zarejestrować moje klasy na liście

Przykład:

// Somehow, from outside the myclass, in a scope that will be called 
//in the begining of the proccess, add "MyClass1" to a 
//list so it can be instanciated later 
class MyClass1{ 

} 

Wtedy zrobię #define z nim lub jeśli stanie, szablon.
Nie wiem, czy wyraziłem się jasno (ponownie) ... Chodzi mi o to, że muszę znać każdą klasę, którą posiadam, bez konieczności nawiązywania połączenia z każdym z nich.
Moim pomysłem było stworzenie #define aby ułatwić zadeklarować nagłówek klasy i wywołać coś, co byłoby zarejestrowanie tej konkretnej klasy do listy

można to zrobić albo będę musiał map go ręcznie?

// desirable: 
#define CLASSREGISTER(myclass) makethemagic(##myclass); class myclass { 
}; 

wiem, ze to określenie nie mogłem użyć dziedziczenia itd ... Chodzi mi o to, aby spróbować dać przykład, co myślałem, aby utworzyć jakoś ...

+0

Myślę, że powinieneś dodać tag "wzorzec projektu". – Alexandru

Odpowiedz

9

Oto metoda wstawić nazwy klas do wektora. Pozostaw komentarz, jeśli przegapię ważne informacje. Nie sądzę jednak, żeby działał na szablony.

struct MyClasses { 
    static vector<string> myclasses; 
    MyClasses(string name) { myclasses.push_back(name); } 
}; 

#define REGISTER_CLASS(cls) static MyClasses myclass_##cls(#cls); 

struct XYZ { 
}; 

REGISTER_CLASS(XYZ); 

Chodzi o to, aby wykonać pewne obliczenia przed wywołaniem funkcji main() i można to osiągnąć poprzez globalną inicjalizację. REGISTER_CLASS (cls) faktycznie generuje kod do wywołania konstruktora MyClasses podczas uruchamiania programu.

UPDATE: Po gf sugestia można napisać tak:

#define REGISTER_CLASS(cls) temp_##cls; static MyClasses myclass_##cls(#cls); class cls 
class REGISTER_CLASS(XYZ) { int x, y, z; } 
+0

Przepraszam, ale nie zrozumiałem tego ... jak mam zrobić, aby zadeklarować klasę za pomocą kodu? – Jonathan

+0

z wyjątkiem std :: string/string – ScottJ

+0

@ Jonathan: wysłał przykład o XYZ. Czy tego właśnie chciałeś? – Alexandru

-2

Użyj boost :: mpl, wektor lub map.

Powiązane problemy