问题描述
我试图通过一个简单的例子来理解如何使用 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);
但是没有编译,我在网上找不到类似的用法,有人可以给我一些关于如何使用上述代码的提示或代码指导吗?
解决方法
-
您应该为第二个模板参数指定默认值,或者将其移至返回类型。
-
使用转发引用
T
可能被推导出为左值引用(当传递像x
和y
这样的左值时),它不是一个数组并产生 {{1} } 对于false
。 -
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)
{
}