C++Primer 16.1定义模板 习题总结

模板总结
摘要由CSDN通过智能技术生成

目录

16.1.1 函数模板

练习16.4 模拟实现find标准库函数

练习16.5 print函数,打印任意元素类型,任意大小的数组。

练习16.6 模拟接收一个数组实参的begin end标准库函数的实现。

16.1.2 类模板 

Blob 类模板和BlobPtr类模板实现

练习16.14 Screen类模板,用非类型模板参数定义Screen的高和宽

16.1.3 模板参数 

 默认模板实参: compare函数的进一步定义。

 练习 16.19 16.20

16.1.4 成员模板

练习16.21  DebugDelete类实现,普通类的成员模板。 

 16.1.5 控制实例化

16.1.6  效率与灵活性

练习16.28


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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值