10

私はこれを理解することはできません。次の抽象テンプレート基本クラスが必要です。


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

        virtual ~Dendrite()
        {
        }

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

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

ここで、Dendriteの正確な使用法を指定するこれから派生します。

今問題。

後で要素をプッシュして指定したい、特定のタイプのない基本クラスへのポインターのベクトルを作成するにはどうすればよいですか?何かのようなもの:


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

これは可能ですか、それともここで非常に基本的なものが欠けていますか?

4

2 に答える 2

15

通常、これは、インターフェイスクラスIEから継承するテンプレートによって実行されます。

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

                virtual ~Dendrite()
                {
                }

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

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

そして、あなたはIDendriteクラスをポインタとして保存することができます:

std::vector<IDendrite*> m_dendriteVec;

ただし、状況によっては、インターフェイスの一部としてテンプレートパラメータを使用しています。これもラップする必要があるかもしれません。

class IVectorParam
{
}

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

あなたに与える

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*);
};
于 2009-09-30T11:30:42.117 に答える
0

はい、可能です。必ず仮想関数と仮想デストラクタを提供してください。さらに、typeidを使用して実際の型を取得できます(また、dynamic_castを使用して型を確認できます)

于 2009-09-30T12:51:59.180 に答える