目录
练习16.5 print函数,打印任意元素类型,任意大小的数组。
练习16.6 模拟接收一个数组实参的begin end标准库函数的实现。
练习16.14 Screen类模板,用非类型模板参数定义Screen的高和宽
练习16.21 DebugDelete类实现,普通类的成员模板。
16.1.1 函数模板
template <typename T> // 其实就是代表一个类型而已,也没啥。
int compare(const T &v1, const T &v2){
if(v1 < v2) return -1;
if(v2 < v1) return 1;
return 0;
}
模板实现compare函数,用于任意两种相同类型的比较,前提是,此类型支持<运算符。
练习16.4 模拟实现find标准库函数
template <typename T1, typename T2>
T1 my_find(const T1& beg,const T1& end,const T2& value){
for(auto i = beg; i != end; ++i){
if(*i == value)
return i;
}
return end;
}
练习16.5 print函数,打印任意元素类型,任意大小的数组。
template <typename T, unsigned int sz> // sz是unsigned类型常量。
void print(const T (&arr)[sz]){
for(int i = 0; i != sz; ++i){
cout<<arr[i]<<" ";
}
cout<<endl;
}
void test_16_5(){
int arr1[5] = {1,2,3,4,5};
print(arr1);
string arr2[3] = {"aaa","bbb","ccc"};
print(arr2);
}
这里用到了非类型模板参数,其中的unsigned int sz就是一个非类型模板参数,可用于模板中需要常量的地方,根据传来的函数实参进行推断此非类型模板参数的模板实参。比如 第一个print中sz = 5,第二个print中sz = 3
练习16.6 模拟接收一个数组实参的begin end标准库函数的实现。
template <typename T, size_t sz>
T* my_begin(T (&arr)[sz]){
return &arr[0];
}
template <typename T, size_t sz>
T* my_end(T (&arr)[sz]){
return &arr[0] + sz;
}
template <typename T, size_t sz>
const T* my_cbegin(const T (&arr)[sz]){
const T* ret = &arr[0];
return ret;
}
template <typename T, size_t sz>
const T* my_cend(const T (&arr)[sz]){
const T* ret = &arr[0] + sz;
return ret;
}
16.1.2 类模板
Blob 类模板和BlobPtr类模板实现
template <typename> class BlobPtr;
template <typename> class Blob;
template <typename T>
bool operator==(const Blob<T>&, const Blob<T>&);
template <typename T>
class Blob{
friend class BlobPtr<T>;
friend bool operator==<T> (const Blob<T>&, const Blob<T>&);
public:
using size_type = typename vector<T>::size_type;
template <typename It> Blob(It t1, It t2);
// : data(make_shared<vector<T>>(t1,t2)) {}
Blob(): data(make_shared<vector<T>>()) {}
Blob(initializer_list<T> il):data(make_shared<vector<T>>(il)) {}
size_type size()const { return data->size(); }
bool empty()const { return data->em