我玩弄模板专业化和 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)来自函数参数的模板特化是否适合数组?