gpt4 book ai didi

c++ - 带有数组的模板特化,std::is_array

转载 作者:搜寻专家 更新时间:2023-10-31 01:12:51 26 4
gpt4 key购买 nike

我玩弄模板特化和 SFINAE。

至于下面的例子,事情似乎很简单:

    template <class T>
void Do(T t, typename std::enable_if<std::is_integral<T>::value >::type* = 0)
{
cout << "is integer" << endl;
}

template <class T>
void Do(T t, typename std::enable_if<std::is_floating_point<T>::value >::type* = 0)
{
cout << "is float" << endl;
}

不,我试过 std::is_array,但从未使用过 std::is_array 的特化。

所以我尝试了为什么 is_array 永远不匹配:

    template <int num>
void Do( int a[num])
{
cout << "int array size " << num << endl;
}

void Do( int* x)
{
cout << "int*" << endl;
}

...
int e[] = { 1,2,3 };
Do(e);
...

的第一个谜是,“int a[num]”的特化从来没有被捕获!函数参数始终为 int* 类型。

如果我使用引用类型,我会得到“正确”的结果:

    template <int num>
void Do( int (&a)[num])
{
cout << "int array size " << num << endl;
}

void Do( int* &x)
{
cout << "int*" << endl;
}

所以我的问题来了:std::is_array 与模板函数参数结合使用是否合理?这个我知道

    cout << boolalpha << std::is_array<decltype(e)>::value << endl;

会给我正确的结果。但是手动声明模板选择没有给我任何功能性的附加功能。我有什么方法可以检测(有或没有 SFINAE)函数参数的模板特化是否适合数组?

最佳答案

我想你自己明白了——如果你想在特化中使用它们的类型,通过引用将数组传递给模板函数。

您想要这样做的原因是数组到指针的衰减,这是模板函数参数在与参数类型匹配之前发生的少数隐式转换之一。这就是为什么当您试图在 DoIt 中检查它是否为数组类型时,T 是一个指针。但是,当目标类型是引用类型时,数组到指针的衰减不会发生。所以,总结一下:

template <class T>
void Do(T& t, typename std::enable_if<std::is_array<T>::value >::type* = 0)

应该可以。

顺便说一句,不使用 SFINAE 的无聊方式

template <class T, unsigned N>
void Do(T (&t)[N])

也有效。

关于c++ - 带有数组的模板特化,std::is_array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13361164/

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