Blob类
1 #include<iostream> 2 #include<initializer_list> 3 #include<vector> 4 using namespace std; 5 6 template <typename T> 7 class Blob { 8 public: 9 typedef typename vector<T>::size_type size_type; 10 11 Blob(); 12 Blob(initializer_list<T> il); 13 size_type size() const { return data->size(); } 14 bool empty() const { return data->empty(); } 15 void push_back(const T &t) { data->push_back(t); } 16 void push_back(T &&t) { data->push_back(std::move(t)); } 17 void pop_back(); 18 T& back(); 19 T& operator[](size_type i); 20 21 private: 22 shared_ptr<vector<T>> data; 23 void check(size_type i, const string &msg) const; 24 }; 25 26 template <typename T> 27 void Blob<T>::check(size_type i, const string &msg) const 28 { 29 if (i >= data->szie()) 30 throw out_of_range(msg); 31 } 32 33 template <typename T> 34 Blob<T>::Blob() : data(make_shared<vector<T>>()) {} 35 36 template <typename T> 37 Blob<T>::Blob(initializer_list<T> il) : data(make_shared<vector<T>>(il)) {} 38 39 template <typename T> 40 T& Blob<T>::back() 41 { 42 check(0, "back on empty Blob"); 43 return data->back(); 44 } 45 46 template <typename T> 47 T& Blob<T>::operator[](size_type i) 48 { 49 check(i, "subscript out of range"); 50 return (*data)[i]; 51 } 52 53 template <typename T> 54 void Blob<T>::pop_back() 55 { 56 check(0, "pop_back on emppty Blob"); 57 data->pop_back(); 58 }