2017-02-14 76 views
1

所以我想寫一個指針的容器,它隱藏了它是一個指針容器的事實。而對於我的AddMember功能,這種方法很有用。基於指針容器循環的範圍中的值語義

#include <iostream> 
#include <vector> 

template<typename T> 
class MyVector : public std::vector<T*> 
{ 
public: 
    void AddMember(T& newMember) 
    { 
     this->push_back(&newMember); 
    } 
}; 

int main() 
{ 
    int a, b; 
    MyVector<int> vec; 
    vec.AddMember(a); 
    vec.AddMember(b); 

    for (auto& member : vec) 
    { 
     std::cout << "Address:" << member << " Value: " << *member << std::endl; 
    } 

    return 0; 
} 

現在,是有可能實現想必begin()end()的方式,範圍爲基礎的循環獲取值語義?即只是member給你的價值?我不想使用boost ptr容器,因爲這將是一個非擁有容器。

+1

這看起來像一個XY問題。你真的想要解決什麼問題? – NathanOliver

+0

我想包裝一個std指針容器,給它一些額外的函數和值語義。我正在努力的部分我已經展示過了。不知道還有什麼要告訴你。 – Psirus

回答

3

現在,是否有可能以基於範圍的for循環獲取值語義的方式實現begin()和end()?

是的。就像每個其他容器一樣,您將需要提供返回迭代器的beginend

你不能直接使用std::vector<T*>::iterator,因爲它有錯誤的值類型,但是你可以在它上面實現你的迭代器。這種包裝迭代器被稱爲迭代器適配器。

幸運的是,boost已經包含了一個迭代器適配器庫,所以你不需要從頭開始實現。您可能需要特別注意boost::indirect_iterator


PS。避免公開繼承標準容器。他們沒有虛擬析構函數,所以很容易錯誤地寫出未定義行爲的程序。

相關問題