关于c ++:指向任意类型的std :: vector的指针(或任何其他模板化类)

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

但是,即使这样看起来并不好,在这里重新评估设计也可能更为重要。