是否可以从模板参数中提取数组大小?
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>
而无需解压类型。
如果这是重复的,我深表歉意。我环顾四周,发现了类似的问题,但没有完全像这样的问题。
如果我像这样实例化一个模板...
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>
而无需解压类型。