指向抽象模板基类的指针?

nha*_*123 10 c++ polymorphism inheritance templates abstract

我无法弄清楚这一点.我需要一个抽象模板基类,如下所示:


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

        virtual ~Dendrite()
        {
        }

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

    protected:
        std::vector<T> _data;
};
Run Code Online (Sandbox Code Playgroud)

现在,我从中得出了指定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>()).
};
Run Code Online (Sandbox Code Playgroud)

这可能还是我错过了一些非常基本的东西?

Dou*_* T. 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;
};
Run Code Online (Sandbox Code Playgroud)

然后你的IDendrite类可以存储为指针:

std::vector<IDendrite*> m_dendriteVec;
Run Code Online (Sandbox Code Playgroud)

但是,在您的情况下,您将模板参数作为界面的一部分.您可能还需要包装它.

class IVectorParam
{
}

template <class T>
class CVectorParam : public IVectorParam
{
    std::vector<T> m_vect;
}
Run Code Online (Sandbox Code Playgroud)

给你

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*);
};
Run Code Online (Sandbox Code Playgroud)