【问题标题】:template class partial specialization with different non-type template parameter具有不同非类型模板参数的模板类偏特化
【发布时间】:2019-11-17 02:34:37
【问题描述】:

是否可以“部分专门化”具有不同非类型模板参数值的模板类? 更具体地说,我试图根据不同的非类型模板参数将 std::vectorstd::array 的使用组合到一个类中,如下所示:

template<typename T, int Size>  //if Size given, use std::array stuff
class MyArray:public std::array<T, Size> {...}

template<typename T> //if Size is not given, use std::vector stuff
class MyArray:public std::vector<T> {...}

但第二个模板将是重新定义的模板错误。我尝试使用 std::enable_if,但不知道如何在这里正确使用它。

【问题讨论】:

  • 您认为大小为 0 是有效大小吗?您是否打算让您的模板从 std::array&lt;T, 0&gt; 派生?
  • @SamVarshavchik 你发现了问题。不,我没有。所以我想知道如何摆脱这种情况?
  • @sz:您可以在第一类定义中添加static_assert,以确保 Size 是您认为可以接受的值。
  • 我正朝着与公认答案相同的方向前进——我正在考虑专注于 Size of 0。

标签: c++ templates


【解决方案1】:

您可以使用标记值:

template<typename T, int Size = -1>  //if Size given, use std::array stuff
class MyArray:public std::array<T, Size> {};

template<typename T> //if Size is not given, use std::vector stuff
class MyArray<T, -1>:public std::vector<T> {};

演示:https://godbolt.org/z/XpJ254

【讨论】:

  • Size 一个默认值-1 似乎是合适的。
  • @super:是的,我在你评论的同时解决了这个问题。 :)
  • std::array 的第二个参数类型为std::size_t。我建议将int 替换为std::size_t。见std::span的声明。
  • @Evg:同意,写完这个答案后,OP 指定 0 不是其数组的有效元素数,因此我们确实可以使用 size_t 和 0 的哨兵值。
猜你喜欢
  • 2014-09-16
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多