如何在类级别对模板化类进行专门化

  • 本文关键字:专门化 c++ templates
  • 更新时间 :
  • 英文 :


最近有人问我一个问题。我有下面的模板类:

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可以访问它。

相关内容

  • 没有找到相关文章

最新更新