2009-09-30 34 views
8

Bunu çözemiyorum.Özet şablon taban sınıfının bir işaretçisi?


template <class T> class Dendrite 
{ 
    public: 
     Dendrite() 
     { 
     } 

     virtual ~Dendrite() 
     { 
     } 

     virtual void Get(std::vector<T> &o) = 0; 

    protected: 
     std::vector<T> _data; 
}; 

Şimdi, Dendrite tam kullanımını belirtir hangi Bu kaynaklanıyor: Aşağıdaki hangi , soyut bir şablon temel sınıfı olması gerekir.

Şimdi sorun.

Belirli bir türü olmayan taban sınıfına işaretçi vektörünü nasıl oluşturabilirim? Öğeleri daha sonra iterek belirtmek istiyorum. Şunlar gibi:


class Foo 
{ 
    public: 
     ... 

    private: 
     std::vector<Dendrite *> _inputs; //!< Unfortunately, this doesn't work... 

     //! Now I could later on push elements to this vector like 
     //! 
     //! _inputs.push_back(new DeriveFromDendrite<double>()) and 
     //! _inputs.push_back(new DeriveFromDendrite<int>()). 
}; 

Bu mümkün mü yoksa ben burada çok basit bir şey eksik miyim?

template <class T> class Dendrite : public IDendrite 
{ 
     public: 
       Dendrite() 
       { 
       } 

       virtual ~Dendrite() 
       { 
       } 

       void Get(std::vector<T> &o) = 0; 

     protected: 
       std::vector<T> _data; 
}; 

ve sonra IDendrite sınıf işaretçileri olarak saklanabilir ediyoruz:

+0

Benzer: http://stackoverflow.com/questions/1479498/how-to-subclass-a-templated-base -sınıf –

cevap

14

Genellikle bu bir arayüz sınıfından devralan Şablonunuza, IE tarafından yapılır içinde,

std::vector<IDendrite*> m_dendriteVec; 

Ancak senin Durumunda, ara yüzünüzün bir parçası olarak şablon parametresini alıyorsunuz. Ayrıca bunu da sarmanız gerekebilir.

class IVectorParam 
{ 
} 

template <class T> 
class CVectorParam : public IVectorParam 
{ 
    std::vector<T> m_vect; 
} 

size

class IDendrite 
{ 
    ... 
public: 
    virtual ~IDendrite() 
    virtual void Get(IVectorParam*) = 0; 
} 

template <class T> class Dendrite : public IDendrite 
{ 
    ... 
    // my get has to downcast to o CVectorParam<T> 
    virtual void Get(IVectorParam*); 
}; 
0

vererek Evet bu mümkün. Sadece sanal işlevler ve sanal yıkıcı sağladığınızdan emin olun. Buna ek olarak, gerçek tipi (yanı sıra türü kontrol etmek için dynamic_cast) almak için typeid kullanabilirsiniz.

İlgili konular