2016-10-05 1 views
0

Jedes Mal, wenn ich ein Objekt erstelle, speichere ich den Zeiger dieses Objekts in einem Vektor, der ein statisches Mitglied der Klasse des Objekts ist, um seinen Zustand zu überwachen Dieser:C++ Vektor der Vorlagenklasse, Polymorphismus

class A { 
private: 
    static std::vector<A *> as; 
    STATE state = NONE; //<- enum 
    void doSomething(); 

public: 
    A() { 
     as.push_back(this); 
    } 

    static void monitor() { 
     auto end = as.end(); 

     for (auto obj = as.begin(); obj != end; obj++) { 
      switch ((*obj)->state) { 
       //process it 
       (*obj)->doSomething(); 
      } 
     } 
    } 
} 

//// recurrent call in other part of the program or even in other thread 
A::monitor(); 

der obige Code ist offensichtlich unvollständig, fehlt ein entsprechend destructor, um den Zeiger des Vektors zu entfernen, die gelöscht wird.

das Problem ist jetzt, dass ich das gleiche mit einer Template-Klasse

template <typename T> 
class A {    

    void doSomething(); //<--independent, no template 
    .... 
} 

Gibt es eine Möglichkeit zu tun, das gleiche zu tun ?, die unabhängige Typ-Methode „doSomething()“ die Anwendung für jedes Objekt?

Wenn die Funktion "doSomething()" abhängiger Typ wäre, gäbe es eine Möglichkeit, dasselbe zu erreichen?

Antwort

4

können Sie das gleiche tun:

template <typename T> 
class A { 
private: 
    static std::vector<A<T>*> as; 
    STATE state = NONE; //<- enum 
    void doSomething() 

public: 
    A() { as.push_back(this); } 

    static void monitor() { 
     auto end = as.end(); 

     for (auto obj = as.begin(); obj != end; obj++) { 
      switch ((*obj)->state) { 
       //process it 
       (*obj)->doSomething(); 
      } 
     } 
    } 
} 

template <typename T> 
std::vector<A<T>*> as; 

Sie müssen nur

A<MyType>::monitor(); 
+0

nennen, die eine wirklich gute Lösung, aber ich habe vor, die Klasse als eine Art Schnittstelle zu verwenden, so , die Tatsache, dass der Anruf für jeden ist ein bisschen langweilig. – quetzalfir

+0

@quetzalfir: So scheint es, dass Sie jede 'Klasse A ' von irgendeiner 'Basis' ableiten wollen (wohin Sie diese Implementierung verschieben können), und dann' Base :: monitor(); ' – Jarod42