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 }
View Code

相关文章: