最近有人问我一个问题。我有下面的模板类:
template<size_t SIZE>
class Cache
{
// A lot of class methods omitted
std::array<int, SIZE> _arr;
};
,但有人可能会传递大的大小并在堆栈上分配,耗尽堆栈内存。因此,您可能建议将其更改为在堆上分配:
template<size_t SIZE>
class Cache
{
// A lot of class methods omitted
std::unique_ptr<std::array<int, SIZE>> _arr;
};
但是现在那些想要一个小数组的人将支付间接的成本(我知道这是一个非常小的成本,但对于问题的要点,请接受)。
因此,它向我暗示模板专门化可以允许一些人选择小的std::array
实现,而其他人可以在堆上分配他们的数组。
我假定这个专门化必须在类级别,因为std::array
是一个类成员。
如何在不复制所有(省略的)类方法的情况下实现这个类模板特化?
如何在不重复所有(省略的)类方法的情况下实现这个类模板特化?
把你关心的东西抽象到它自己的mixin类中。例如:
template<size_t SIZE, bool> // default case, condition is false
class storage {
std::unique_ptr<std::array<int, SIZE>> _arr;
protected:
// constructor too...
std::array<int, SIZE>& arr() { return *_arr; }
};
template<size_t SIZE> // special case, condition is true
class storage<SIZE, true> {
std::array<int, SIZE> _arr;
protected:
// constructor too...
std::array<int, SIZE>& arr() { return _arr; }
};
然后让缓存使用它作为基础,同时检查SIZE的阈值:
template<size_t SIZE>
class Cache : private storage<SIZE, (SIZE < THRESHOLD)>
{
// A lot of class methods omitted
// They now use this->arr();
};
你也可以选择组合。在这种情况下,专门化几乎是相同的,但是arr()
需要是公共的,以便Cache
可以访问它。