2016-10-05 28 views
0

オブジェクトを作成するたびに、そのオブジェクトのポインタをオブジェクトのクラスの静的メンバであるベクトルに格納して、その状態を監視します。これ:C++のテンプレートクラス、多態性のベクトル

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(); 

上記のコードは、明らかに不完全で削除されているベクターのポインタを除去するために、適切デストラクタを欠いています。

の問題は、今私は「doSomethingの()」オブジェクトごとに独立したタイプの方法を適用する?テンプレートクラス

template <typename T> 
class A {    

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

同じことを行うにはどのような方法がありますと同じことをしなければならないということですか?

関数 "doSomething()"が依存型であった場合、同じことを達成する方法がありますか?

答えて

4

あなたが同じことを行うことができます。

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; 

はあなただけ

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

を呼び出す必要が本当に良い解決策だが、私はそう、インタフェースの種類としてクラスを使用することを計画していますすべてを呼び出すという事実はちょっと面倒です。 – quetzalfir

+0

@quetzalfir: 'クラスA 'は 'Base'(そこではその実装を動かすことができる)から派生し、' Base :: monitor(); ' – Jarod42