将类型分配给 typename 关键字
Assigning a type into the typename keyword
我正在查看以下模板函数,想知道当我们将 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,编译器真的用它做了什么吗?也许它会生成某种匿名类型?
谢谢
不,我们没有将 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>
作为其默认参数。
我假设您使用的是一个宽松的编译器,它不会抱怨在 =
.
之后缺少 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 is a pointer!",因为如果显式指定模板参数则不使用默认参数。
最后一个意味着这可能不是一个好主意。
我正在查看以下模板函数,想知道当我们将 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,编译器真的用它做了什么吗?也许它会生成某种匿名类型?
谢谢
不,我们没有将 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>
作为其默认参数。
我假设您使用的是一个宽松的编译器,它不会抱怨在 =
.
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 is a pointer!",因为如果显式指定模板参数则不使用默认参数。
最后一个意味着这可能不是一个好主意。