我无法弄清楚这一点。我需要一个抽象模板基类,它 如下:
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>()).
};
这是可能的,还是我错过了一些非常基本的东西?
答案 0 :(得分: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*);
};
答案 1 :(得分:0)
是的,这是可能的。只需确保提供虚拟功能和虚拟析构函数。此外,您可以使用typeid来获取实际类型(以及dynamic_cast来检查类型)