c++ - 根据模板参数删除成员

标签 c++ templates vector

我想设计一个带有小 vector 优化的 vector 类。看起来像:

template <typename T, int small_size = 0>
class Vector {
private:
    T data_small_[small_size];
    T* data_;
    T* size_;
    T* capacity_;
public:
    ...
}

不幸的是,大多数时候,该类将与 small_size = 0 一起使用。有没有一种方法可以删除 small_size = 0 的 data_small_ 而无需进入模板特化并重写该类的整个代码?

最佳答案

您可以使用 empty base optimization这里。您将不得不更改 Vector不要引用data_small_直接地。相反,写使用 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];
 }
};

关于c++ - 根据模板参数删除成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28265197/

相关文章:

c++ - 区分指针和数据变量

c++ - 如何将 Char** 插入 uin8_t vector ?

c++ - 是否可以在 native Windows 8.1 桌面应用程序中确定屏幕方向?

c++ - std::enable_if 的替代方案和模板模板参数的显式重载

c++ - 一个 C++ 迭代器适配器,它包装和隐藏内部迭代器并转换迭代类型

Drupal - 查找模板的一般方法?

c++ - 除非旋转为 0 度或 180 度,否则物体不会朝它所面对的方向移动

按属性对对象 vector 进行排序的 C++ 模板

C++ 提升 asio tcp 套接字读取旧数据

c++ - 为什么 std::string 不提供到 char* 的隐式转换?