pointer to std::vector of arbitrary type (or any other templated class)
假设我想要一个指向std :: vector的指针的成员变量,但我不想指定它存储什么类型的变量。 我只想访问独立于其实际泛型类型的那些函数。 C ++有可能吗? 像这样的东西:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | class Foo{ public: void setVec(std::vector* someVec){ myVec = someVec; }; int getSize(){ return myVec.size(); }; private: std::vector* myVec; }; int main(){ Foo foo; vector<int> vec1; vector<float> vec2; foo.setVec(&vec1); cout<<foo.getSize(); foo.setVec(&vec2); cout<<foo.getSize(); } |
注意:我不想为Foo建立模板,我只想使用Foo的单个实例以及不同类型的向量。
当然-如果我可以更改类向量,则可以创建未模板化的基类
1 2 3 | class Ivector{ virtual int size()=0; }; |
然后使
1 | class vector< T > : public IVector... |
从Ivector继承。 但是,如果我无法更改相关类并且模板化类没有这样的未模板化基类,该怎么办?
谢谢!
您快要回答了。 与其让std :: vector从Ivector继承,不如创建一个新类:
1 2 3 4 5 6 7 8 9 10 | template <typename T> class IVectorImpl : public Ivector { public: explicit IVectorImpl(std::vector< T > * Data) : m_Data(Data){} std::vector< T > * m_Data; ... virtual int size() const {return m_Data->size();} // Implement all the Ivector functions here to call the respective functions off of m_Data }; |
现在让您的Foo类保留指向Ivector的指针,而不是std :: vector。
使Foo :: setVec模板化
1 2 3 4 5 6 7 | template <typename T> void setVec(std::vector< T > * vec) { Ivector * newVec = new IVectorImpl< T >(vec); delete myVec; myVec = newVec; } |
您可以这样做:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | class vector_container_base { public: ~vector_container_base() {} virtual std::size_t size() const = 0; }; template <typename T> class vector_container : public vector_container_base { public: typedef std::vector< T > vector_type; std::size_t size() const { return mVector.size(); } private: vector_type mVector; }; |
依此类推,但我怀疑这在任何实际情况下是否都有用。
线
1 | std::vector* myVec |
在语法上不正确。 必须指定矢量元素的类型。
您可能想做一些事情
1 2 3 4 5 | template< typename T > class Foo{ private: std::vector< T > * myVec; }; |
但是,即使这样看起来并不好,在这里重新评估设计也可能更为重要。