@@ -4,31 +4,42 @@ namespace user{
44//array类模板特化部分
55template<std::size_t N>
66class array<bool, N>; //特化的声明
7- template<std::size_t N, std::size_t M> //模板参数与另一个不同,所以它是一个重载
7+ template<std::size_t I, std::size_t N> //模板参数与另一个不同,所以它是一个重载
8+ typename std::bitset<N>::reference get(array<bool, N>&);
9+ template<std::size_t I, std::size_t N>
10+ const bool get(const array<bool, N>&);
11+ template<std::size_t N, std::size_t M> //它也是函数模板重载
812void swap(array<bool, N>&, array<bool, M>&);
913template<std::size_t N>
14+ constexpr bool operator<(
15+ const array<bool, N>&, const array<bool, N>&
16+ ); //这个是专门为bool数组比较而设计的,因为std::bitset没有迭代器这个概念
17+ //模板定义部分
18+ template<std::size_t N>
1019class array<bool, N> { //定义array<bool,N>部分特化
1120 std::bitset<N> _elem; //std::bitset可以更方便地解决我们的问题
1221public:
22+ using reference = typename std::bitset<N>::reference;
23+ //类型别名,方便我们使用reference
1324 array(std::initializer_list<bool>); //构造函数
1425 array(const array&); //拷贝构造函数,这里的array是array<bool,N>
1526 array& operator=(const array&); //赋值运算符
16- constexpr bool& at(std::size_t);
17- constexpr const bool& at(std::size_t)const;
18- constexpr bool& operator[](std::size_t);
19- constexpr const bool& operator[](std::size_t)const;
20- constexpr bool& front() { return _elem[0]; } //std::bitset支持下标运算符
21- constexpr const bool& front()const { return _elem[0]; }
22- constexpr bool& back() { return _elem[N - 1]; }
23- constexpr const bool& back()const { return _elem[N - 1]; }
27+ constexpr reference at(std::size_t);
28+ constexpr bool at(std::size_t)const;
29+ constexpr reference operator[](std::size_t);
30+ constexpr bool operator[](std::size_t)const;
31+ constexpr reference front() { return _elem[0]; } //std::bitset支持下标
32+ constexpr bool front()const { return _elem[0]; }
33+ constexpr reference back() { return _elem[N - 1]; }
34+ constexpr bool back()const { return _elem[N - 1]; }
2435 constexpr bool empty()const { return !N; }
2536 constexpr std::size_t size()const { return N; }
26- void fill(bool); //对于bool来说 ,传值比传常量引用更省内存空间
27- template<std::size_t I, typename U, std::size_t M>
28- friend U& get(array<U , M>&); //不建议把U改成bool,因为U不是T
29- //声明模板友元,所有的get<U ,M>函数实例都是类实例array<bool,N>的友元
30- template<std::size_t I, typename U, std::size_t M>
31- friend const U& get(const array<U , M>&);
37+ void fill(bool); //对于bool类型来说 ,传值比传常量引用更省内存空间
38+ template<std::size_t I, std::size_t M>
39+ friend typename std::bitset<M>::reference get(array<bool , M>&);
40+ //声明模板友元,所有的get<I ,M>函数实例都是类实例array<bool,N>的友元
41+ template<std::size_t I, std::size_t M>
42+ friend const bool get(const array<bool , M>&);
3243 //同上
3344 template<std::size_t N1, std::size_t N2>
3445 friend void swap(array<bool, N1>&, array<bool, N2>&);
@@ -37,5 +48,9 @@ public:
3748 //声明友元类模板,任何一个array实例都是array<bool,N>的友元
3849 template<std::size_t M>
3950 void swap(array<bool, M>&);
40- }; //其中有些友元不需要重新定义(因为特化也是原模板的一部分),但有些需要
51+ template<std::size_t M>
52+ friend constexpr bool operator<(
53+ const array<bool, M>&, const array<bool, M>&
54+ );
55+ };
4156}; //end namespace user
0 commit comments