表达式 std::enable_if 中的类型 * 是什么
Whats is type* in the expression std::enable_if
谁能给我解释一下 type*
是什么意思?
我在文档中看到 std::enable_if 这个例子:
// #3, enabled via a parameter
template<class T>
void destroy(
T* t,
typename std::enable_if<std::is_trivially_destructible<T>::value>::type* = 0
){
std::cout << "destroying trivially destructible T\n";
}
这里为什么要用类型,什么是type*
?
谢谢!
不是type*
;这是 <the member type of the whole enable_if thing>*
.
enable_if
有点乱;默认情况下 type
成员只是 void
,所以我们所做的一切(如果 T
是微不足道的可破坏的)是声明一个类型为 void*
的未命名模板参数,默认为0
(或nullptr
),我们可以完全忽略它。
我们拥有它的唯一原因是,如果 T
不是 平凡可破坏的,那么就没有这样的成员类型 type
,所以destroy
的这种特殊专业化将不存在(通过 SFINAE 的魔法)。
这有点像在万圣节前绕过邻居,但随后却不接受他们的任何糖果,因为您实际上并不想要任何糖果:您只是想看看您的邻居是否在家。他们会像 "why did he/she/it do that? how weird" 但你有你的答案所以它确实是有目的的。
如果 std::is_trivially_destructible<T>::value == true
则它是指向 std::enable_if
公开的类型的指针,否则它不存在。它公开的默认类型是 void
.
请记住,对于 SFINAE,我们只是试图触发替换错误,我们可以通过尝试使用 std::enable_if
的 typedef type
来做到这一点。如果 std::is_trivially_destructible<T>::value
是 false
,则 type
将不存在,并且将跳过该函数以进行重载解析。
我们也可以指定我们自己的类型,也许这样就很清楚了:
std::enable_if<true, int>::type* intPointer;
此处,intPointer
的类型为 int*
。
如果没有 enable_if
的检查,它看起来有点像:
template <typename T>
struct enable_always
{
typedef T type;
};
谁能给我解释一下 type*
是什么意思?
我在文档中看到 std::enable_if 这个例子:
// #3, enabled via a parameter
template<class T>
void destroy(
T* t,
typename std::enable_if<std::is_trivially_destructible<T>::value>::type* = 0
){
std::cout << "destroying trivially destructible T\n";
}
这里为什么要用类型,什么是type*
?
谢谢!
不是type*
;这是 <the member type of the whole enable_if thing>*
.
enable_if
有点乱;默认情况下 type
成员只是 void
,所以我们所做的一切(如果 T
是微不足道的可破坏的)是声明一个类型为 void*
的未命名模板参数,默认为0
(或nullptr
),我们可以完全忽略它。
我们拥有它的唯一原因是,如果 T
不是 平凡可破坏的,那么就没有这样的成员类型 type
,所以destroy
的这种特殊专业化将不存在(通过 SFINAE 的魔法)。
这有点像在万圣节前绕过邻居,但随后却不接受他们的任何糖果,因为您实际上并不想要任何糖果:您只是想看看您的邻居是否在家。他们会像 "why did he/she/it do that? how weird" 但你有你的答案所以它确实是有目的的。
如果 std::is_trivially_destructible<T>::value == true
则它是指向 std::enable_if
公开的类型的指针,否则它不存在。它公开的默认类型是 void
.
请记住,对于 SFINAE,我们只是试图触发替换错误,我们可以通过尝试使用 std::enable_if
的 typedef type
来做到这一点。如果 std::is_trivially_destructible<T>::value
是 false
,则 type
将不存在,并且将跳过该函数以进行重载解析。
我们也可以指定我们自己的类型,也许这样就很清楚了:
std::enable_if<true, int>::type* intPointer;
此处,intPointer
的类型为 int*
。
如果没有 enable_if
的检查,它看起来有点像:
template <typename T>
struct enable_always
{
typedef T type;
};