为什么模板函数中的std::is_array不区分整型和数组类型?

Why the std::is_array in template function is not distinguishing between int and array type?

在下面的代码中,我使用模板函数和类型特征来区分整数类型(其他情况)和数组类型。我希望输出分别为 intarray,而我得到 int int 两个分别使用 int 类型和数组实例化模板函数的调用类型:

这是为什么?

#include <iostream>
#include <array>

template <typename T>
inline static void constexpr SetCoordinates()
{
    if (std::is_array<T>::value)
        std::cout<<"array\n";
    else
        std::cout<<"int\n";
}


int main()
{
 int a = 6;
 std::array<int, 4> arr = {1,2,3,4};
 SetCoordinates<decltype(a)>();
 SetCoordinates<decltype(arr)>();
 return 0;
}

std::is_array不包括std::array的情况;相反,它只检查类型是否只是普通数组类型(即 T[]T[N])。因此,您的 if 语句落在错误的分支中。

您必须为 std::array 提供自定义特征才能实现:

#include <type_traits> // std::true_type, std::false_type, std::is_array
    
template <typename T> struct is_std_array : std::false_type{};
template < typename T, std::size_t N>
struct is_std_array<std::array<T, N> > : std::true_type { };

template <typename T>
inline static void constexpr SetCoordinates()
{
    if (std::is_array<T>::value || is_std_array<T>::value)
        //                       ^^^^^^^^^^^^^^^^^^^^^^^^^-->and check
        std::cout << "array\n";
    else
        std::cout << "int\n";
}

See a demo

在这种简单的情况下,我可以使用 std::is_integral,前提是仅使用这两种类型调用模板函数:

#include <iostream>
#include <array>

template <typename T>
inline static void constexpr SetCoordinates()
{
    if (std::is_integral<T>::value)
        std::cout<<"int\n";
    else
        std::cout<<"array\n";
}


int main()
{
 int a = 6;
 std::array<int, 4> arr = {1,2,3,4};
 SetCoordinates<decltype(a)>();
 SetCoordinates<decltype(arr)>();
 return 0;
}