exceptional C++ Item4-5

模板成员函数,嗯,是一个和我有距离的概念。。。

我写出来的答案和错误的答案几乎一样。。。汗一个。。。

贴上正确的代码吧,认真学习一下:

// A strongly exception-safe version: 
//
template<typename T, size_t size>
class fixed_vector
{
public:
  typedef T*       iterator;
  typedef const T* const_iterator;

  fixed_vector() : v_( new T[size] ) { }

  ~fixed_vector() { delete[] v_; }

  template<typename O, size_t osize>//再次定义一个不同的模板类型能够让其更通用
  fixed_vector( const fixed_vector<O,osize>& other )
    : v_( new T[size] )
    { try {copy(other.begin(),other.begin()+min(size,osize),//使用try catch结构保证稳定性
               begin());}
      catch(...) { delete[] v_; throw; }}
  fixed_vector( const fixed_vector<T,size>& other )
    : v_( new T[size] )
    { try {copy(other.begin(), other.end(), begin());}
      catch(...) { delete[] v_; throw; }}

  void Swap( fixed_vector<T,size>& other ) throw()
  {
    swap( v_, other.v_ );
  }

  template<typename O, size_t osize>
  fixed_vector<T,size>& operator=(
    const fixed_vector<O,osize>& other )//同上,采用新的模板类型来增加通用性
  {
    fixed_vector<T,size> temp( other ); // does all the work
    Swap( temp ); return *this;         // this can't throw
  }
  fixed_vector<T,size>& operator=(
    const fixed_vector<T,size>& other ) {//为啥要两个拷贝赋值函数呢。。。模板不能特化?
    fixed_vector<T,size> temp( other ); // does all the work
    Swap( temp ); return *this;         // this can't throw
  }

  iterator       begin()       { return v_; }
  iterator       end()         { return v_+size; }
  const_iterator begin() const { return v_; }
  const_iterator end()   const { return v_+size; }

private:
  T* v_;
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值