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

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

本文关键字:提取 数组 参数 是否      更新时间:2023-10-16

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

如果我实例化这样的模板…

MyClass<int[10]> c;

如何编写模板以访问类型和数组大小我想的都试过了,但都试不到。

我的灵感来自std::函数模板,它可以让你使用与函数原型类似的语法,比如。。。

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

所以我认为数组和它的大小有相似的东西会很好。我可以使用任何最新的c++功能(c++11/14(。

您可以添加一个部分专业化,如下所示:

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

这是一个演示。

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>

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);
};