C++primer_练习16.6

近日在补之前欠下C++的账,第十六章模板的练习16.6比较特别,单独记录一下。

练习16.6:你认为接受一个数组实参的标准库函数begin和end是如何工作?定义你自己版本的begin和end。

知识点:

(1)考察模板定义,非类型模板参数,这一方面具体书上都有,不详细讲解,看书!

(2)数组与数组名,const的强制转换。

(3)begin()是一个模版函数,接受一个容器的引用,返回指向容器第一个元素的迭代器

end()是一个模版函数,接受一个容器的引用,返回指向容器最后一个元素下一个地方的迭代器

首先附上begin_end.h

#pragma once
#ifndef ARRAY_BEGIN_END_H

#define ARRAY_BEGIN_END_H

template <typename T,unsigned N>
 T* mybegin(const T(&a)[N])
{
    return const_cast<T *>(a);
}
template <typename T, unsigned N>
 T* myend(const T(&a)[N])
{
    return const_cast<T *>(a) +N;
}

#endif ARRAY_BEGIN_END_H

首先,模板定义中,要注意数组的引用,const T(&a)[N]   其中的括号必不可少,不然就变成了引用数组,会报错,引用数组在C++中是不合法的。

其次,在返回容器的迭代器的时候,要注意要求返回的是T*,而数组名外延为指针的时候,是const T*类型的,显然直接由const T*到T* 在C++是不允许的,这时候我们就需要通过const_cast<T*>进行强制转换。

在源文件引入该头文件,并调用即可通过,完成该功能需要。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值