@@ -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