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

Is it possible to extract array size from a template argument?

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

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

MyClass<int[10]> c;

如何编写模板来访问类型和数组大小?我已经尝试了所有我能想到的方法,但我无法获得。

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

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

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

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

template <typename T, ptrdiff_t N>
class MyClass<T[N]>
{
};

这是一个demo

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);
};
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> 而无需解压类型。