一个指向模板抽象基类?(A pointer to abstract template base cl

2019-08-17 01:51发布

我不知道这一点。 我需要有一个抽象的模板基类,如下:


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

这是可能的还是我失去了一些非常基本的吗?

Answer 1:

通常,这是由你的模板从一个接口类,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*);
};


Answer 2:

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



文章来源: A pointer to abstract template base class?