gpt4 book ai didi

c++ - 为什么模板函数中的 std::is_array 不区分 int 和 array 类型?

转载 作者:行者123 更新时间:2023-12-05 08:45:37 25 4
gpt4 key购买 nike

在下面的代码中,我使用模板函数和类型特征来区分整数类型(else case)和数组类型。我希望输出分别是 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 语句位于 false 分支。

您必须为 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

关于c++ - 为什么模板函数中的 std::is_array 不区分 int 和 array 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72197716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com