c++11中自由函数begin()及end()的实现

c++11中新增了自由函数begin,end,可以用在数组上,如:
    char s[] = "abcdefg";
    for(auto i= std::begin(s); i != std::end(s); i++)
    {
        std::cout << *i << std::endl;
    }

一直好奇std::end函数的实现方式,它是如何知道数组长度的?查看g++中标准库的源码,找到数组的实际如下:

  template<class _Tp, size_t _Nm>
    inline _Tp*
    begin(_Tp (&__arr)[_Nm])
    { return __arr; }
 
  template<class _Tp, size_t _Nm>
    inline _Tp*
    end(_Tp (&__arr)[_Nm])
    { return __arr + _Nm; }

 

可以看到参数为指向数组的引用,数组大小也通过模板巧妙的实现了,模板扩展后的代码类似如下:
 
//test.cpp
#include <iostream>
//#include <iterator>
 
char* begin(char (&arr)[8])
{
    return arr;
}
 
char* end(char (&arr)[8])
{
    return arr + 8;
}
 
int main() 
{
    char s[] = "abcdefg";
    for(auto i= begin(s); i != end(s); i++)
    {
        std::cout << *i << std::endl;
    }
    return 0;
}

 

 

 

posted on 2016-01-20 17:53  gavinx000  阅读(1354)  评论(0)    收藏  举报