是否可以从模板参数中提取数组大小?

时间:2015-06-01 15:20:43

标签: c++ templates c++11 template-meta-programming

如果这是重复,我道歉。我环顾四周,发现了类似的问题但没有完全像这样。

如果我像这样实例化模板......

MyClass<int[10]> c;

如何编写模板以获取对类型和数组大小的访问权限?我已经尝试了所有我能想到的内容而无法获得它。

我受到了std :: function模板的启发,它允许你使用与函数原型类似的语法,比如......

std::function<int(MyClass&)> myfunc;

所以我认为对阵列及其大小有类似的东西会很好。我可以使用任何最新的c ++功能(c ++ 11/14)。

3 个答案:

答案 0 :(得分:17)

您可以添加如下所示的部分特化:

ZXImage

这里是demo

答案 1 :(得分:3)

template<class Arr>
struct array_size {};
template<class T, size_t N>
struct array_size<T[N]>:std::integral_constant<std::size_t, N>{};
template<class Arr>
struct array_element {};
template<class Arr>
using array_element_t = typename array_element<Arr>::type;
template<class T, size_t N>
struct array_element<T[N]>{using type=T;};

现在您可以array_size<ArrType>{}array_element_t<ArrType>而无需解压缩类型。

答案 2 :(得分:2)

template <typename T, typename = void>
struct deduce
{
};

template <typename T>
struct deduce<T,
  typename ::std::enable_if<
    ::std::is_array<T>{}
  >::type
>
{
  using value_type =
    typename ::std::decay<decltype(::std::declval<T>()[0])>::type;

  static constexpr auto size = sizeof(T) / sizeof(value_type);
};