抽象模板基类的指针?

11

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


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

        virtual ~Dendrite()
        {
        }

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

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

现在,我从这个中得到了确切使用树突的信息。

现在遇到了问题。

如何创建一个指向基类的指针向量,没有具体类型,并且我希望稍后通过将元素推入其中来指定类型?像这样:

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

这个有可能实现,或者是我漏掉了一些很基础的东西吗?


类似:https://dev59.com/_0nSa4cB1Zd3GeqPOoW0 - Éric Malenfant
2个回答

15

通常这是通过你的模板继承一个接口类来完成的,例如:

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*);
};

0

是的,这是可能的。只需确保提供虚函数和虚析构函数。此外,您可以使用typeid获取实际类型(以及dynamic_cast检查类型)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接