为什么模板函数中的std::is_array不区分整型和数组类型?
Why the std::is_array in template function is not distinguishing between int and array type?
在下面的代码中,我使用模板函数和类型特征来区分整数类型(其他情况)和数组类型。我希望输出分别为 int
和 array
,而我得到 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";
}
在这种简单的情况下,我可以使用 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;
}
在下面的代码中,我使用模板函数和类型特征来区分整数类型(其他情况)和数组类型。我希望输出分别为 int
和 array
,而我得到 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";
}
在这种简单的情况下,我可以使用 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;
}