使用类型特征检测是否传递了数组或指针

问题描述

我试图通过一个简单的例子来理解如何使用 std::enable_if,问题是:

我正在阅读 David Vandevoorde、Nicolai M.Josuttis 的教科书 C++ 模板完整指南,第 7 章,第 4 节。

本章提到:“您可以使用类型特征来检测是否传递了数组(或指针)”,其代码如下:

template<typename T,std::enable_if_t<std::is_array_v<T>>>
void foo(T&& arg1,T&& arg2)
{
    
}

我的问题是,上面的代码应该如何调用和使用?例如,我试过:

int x[] = {1,2,3};
int y[] = {1,3,4,5};
foo(x,y);

但是没有编译,我在网上找不到类似的用法,有人可以给我一些关于如何使用上述代码提示代码指导吗?

解决方法

  1. 您应该为第二个模板参数指定默认值,或者将其移至返回类型。

  2. 使用转发引用 T 可能被推导出为左值引用(当传递像 xy 这样的左值时),它不是一个数组并产生 {{1} } 对于false

  3. std::is_array 属于 x 类型,int[3] 属于 y 类型。它们是不同的类型并导致 int[5] 失败的类型推导。

所以

T

template<typename T,std::enable_if_t<std::is_array_v<std::remove_reference_t<T>>>* = nullptr>
void foo(T&& arg1,T&& arg2)
{ 
}

然后

template<typename T>
std::enable_if_t<std::is_array_v<std::remove_reference_t<T>>> foo(T&& arg1,T&& arg2)
{ 
}

LIVE