2010-10-21 77 views
2

比方說,我想有一個指向std :: vector的指針的成員變量,但我不想指定它存儲的變量類型。我只想訪問那些獨立於實際泛型類型的函數。這是可能的與C + +?這樣的事情:任意類型(或任何其他模板類)的std :: vector指針

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的一個實例與不同類型的向量。

當然

- 如果我可以改變類載體的話,我可以創建一個基類untemplated

class Ivector{ 
    virtual int size()=0; 
}; 

,然後從Ivector使

class vector<T> : public IVector... 

繼承。但是如果我不能改變有問題的類並且模板類沒有這樣的模糊基類,我該怎麼辦?

謝謝!

+2

強制性*爲什麼?*請詢問你正在試圖解決此問題的幫助,而不是一步,你覺得你需要去解決它。 – GManNickG 2010-10-21 02:18:09

+0

好奇心。我正在瞭解模板類可以做什麼。所以現在我想知道如果我不知道他們的模板類型是否可以指向模板類。 – Mat 2010-10-21 02:23:46

+0

模板類不是類類型,它的實例化是。很難回答一個無法解釋的問題。 – GManNickG 2010-10-21 02:24:40

回答

4

你幾乎在答案。相反,從Ivector製作的std ::向量繼承,創建一個新類:

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 ::向量。

讓富:: setVec模板

template <typename T> 
void setVec(std::vector<T> * vec) 
{ 
    Ivector * newVec = new IVectorImpl<T>(vec); 
    delete myVec; 
    myVec = newVec; 
} 
0

std::vector* myVec 

不是語法正確。必須指定矢量元素的類型。

可能想要做的事上的

template< typename T > 
class Foo{ 
    private: 
    std::vector<T> * myVec; 
}; 

然而行,甚至不好看,重新評估設計可能是更重要的位置。等

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

而且,但我懷疑這是在任何真實的情況太有用了:

+0

是的,我知道。但重點是我不想爲Foo做模板。我可以將指針存儲爲void * - 但之後我沒有機會調用.size(),即使我知道它是一個指向矢量的指針(但我不知道指向某個類型的矢量的指針) – Mat 2010-10-21 02:30:43

1

你能做到這一點。

+0

hey這實際上很整潔!沒有想到封裝它。但它仍然會爲其創建一個特殊的課程。但它是一個工作workroundround - thx :) – Mat 2010-10-21 02:34:22

+0

@Mat:解決*什麼*? – GManNickG 2010-10-21 02:34:50

+0

舊的,醜陋的和未註釋的代碼,曾經工作一年前,但不再這樣做。謝謝! =) – Mat 2010-10-21 02:39:35

相關問題