近日在补之前欠下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*>进行强制转换。
在源文件引入该头文件,并调用即可通过,完成该功能需要。