我正在查看以下模板功能,并想知道当我们将enable_if
类型分配到typename
关键字时,幕后会发生什么:
template <typename T, typename = std::enable_if<std::is_pointer<T>::value>::type>
// ^^ What happens here?
void foo()
{
std::cout << "T is a pointer!" << std::endl;
}
除了明显的SFINAE之外,编译器是否真的对它做了些什么呢?也许它会产生某种匿名类型?
由于
答案 0 :(得分:3)
我假设您正在使用一个宽松的编译器,它不会在typename
之后抱怨丢失的=
关键字。
这是一个未命名的模板参数,否则将被忽略,以及默认模板参数,如果未指定其他模板参数,将使用该参数。
这意味着foo<void *>()
解析为foo<void *, std::enable_if<std::is_pointer<void *>::value>::type>()
,foo<void *, void>()
。
这意味着foo<int>()
将解析为foo<int, std::enable_if<std::is_pointer<int>::value>::type>()
,但会被拒绝,因为std::enable_if<std::is_pointer<int>::value>
没有任何type
成员。
这意味着foo<int, int>()
可以工作并打印“T是指针!”,因为如果明确指定了模板参数,则不使用默认参数。
最后一个意味着这可能不是一个好主意。
答案 1 :(得分:1)
不,我们未将enable_if
类型分配给typename
关键字,此处仅省略模板参数,因为它不会被使用:
template <typename T, typename Anonymous_Template_Parameter = std::enable_if<std::is_pointer<T>::value>::type>
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
并=
将std::enable_if<std::is_pointer<T>::value>::type>
作为默认参数。