我想设计一个带有小 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/