根据模板参数删除成员

Ins*_*oop 4 c++ templates vector

我想设计一个带矢量优化的矢量类.看起来像:

template <typename T, int small_size = 0>
class Vector {
private:
    T data_small_[small_size];
    T* data_;
    T* size_;
    T* capacity_;
public:
    ...
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,大多数情况下,该类将与small_size = 0一起使用.有没有办法删除data_small_ for small_size = 0而不进入模板专门化并重写该类的整个代码?

Pra*_*han 5

您可以在此处使用空基优化.您必须更改Vector为不data_small_直接引用.相反,使用write SmallData来实现所需的成员函数并small_size = 0在部分特化中处理这种情况SmallData<T, 0>.下面是一个SmallData实现复制构造函数operator[]Vector使用它们而不用担心的示例small_size.

template <typename T, int small_size>
class SmallData
{
 public:
  SmallData(const SmallData& other)
  {
   for(size_t i = 0; i < small_size; i++)
     data_small_[i] = other.data_small_[i];
  }

 T& operator[](int k){return data_small_[k];} 
 protected:
  T data_small_[small_size];
};

template <typename T>
class SmallData<T, 0>
{
 public:
 T& operator[](int k){//throw some error} 
};

template <typename T, int small_size = 0>
class Vector : public SmallData<T, small_size>
{
 public:
 Vector(const Vector& other) : SmallData<T, small_size>(other)
 {
  //rest of copy ctor either here on in the member init list above
 }
 T& operator[](int k)
 {
  if(k<small_size) return SmallData<T, small_size>::operator[](k);
  else return data_[k];
 }
};
Run Code Online (Sandbox Code Playgroud)