std::enable_if使用它的内部类型,而不使用它
std::enable_if using its internal type and without using it
为什么要打印"B"
#include <iostream>
template<typename T, typename U = void>
struct Test
{ static void apply() { std::cout << "A" << std::endl; } };
template<typename T>
struct Test<T, typename std::enable_if<true>::type>
{ static void apply() { std::cout << "B" << std::endl; } };
int main()
{
Test<int>::apply();
}
但是这个"A"?:
#include <iostream>
template<typename T, typename U = void>
struct Test
{ static void apply() { std::cout << "A" << std::endl; } };
template<typename T>
struct Test<T, std::enable_if<true>>
{ static void apply() { std::cout << "B" << std::endl; } };
int main()
{
Test<int>::apply();
}
它们之间唯一的区别是,在第一个例子中,我使用typename std::enable_it<true>::type
作为U
(例如void
),但在第二个例子中我直接使用std::enable_if<true>
作为U
,这也是一个定义良好的类型,与void
没有更多意义。
因为当您编写Test<int>
时,实际上是在编写Test<int, void>
,它永远不会与Test<int, std::enable_if<true>>
相同(尽管它与Test<int, typename std::enable_if<true>::type>
相同)
由于typename std::enable_if<true>::type
与void
的类型相同,因此第一个代码段等效于
template<typename T, typename U = void>
struct Test
{ static void apply() { std::cout << "A" << std::endl; } };
template<typename T>
struct Test<T, void> // since typename std::enable_if<true>::type == void
{ static void apply() { std::cout << "B" << std::endl; } };
因此,第二个定义是更专业的,因此,如果不提供两个模板参数,后者将在过载解决中获胜。
然而,在第二个示例中,它只是对类型T
和std::enable_if<true>
的专门化,而不是对T
和void
的专门化。这可以用std::is_same<std::enable_if<true>, void>
进行检查,它的计算结果为false(很明显,void
没有类型成员type
,所以它不可能相同)。
因此,对于第二个片段,请求T<int>
将与只有一个定义相关的T<int, void>
匹配,即第一个定义。
相关文章:
- 来自 Android 应用程序内部的 boost 类型的 boost::wrapexcept<boost::system::system_error> 的未捕获异常
- 嵌套模板函数采用 2 个具有相同内部类型的容器
- 返回给定 SEXP 的子集,而无需知道实际的内部数据类型
- 如何理解c++中在命名空间内部定义的枚举类型enum
- 在变量名后声明带有 () 的非内部类型与不使用变量名的行为不同。即 std::map<int,char>x(); - 这是怎么回事?
- C++:在"try"外部创建的类型会导致错误,但在内部不会
- 如何在QTScript中将QLIST内部的QMAP注册为元素类型
- 如何通过从变量中获取类型来访问内部 typedef
- 是一个被认为是不同类型的班级内部的正向声明
- 如何从对象内部的 typedef 获取模板参数类型
- 如何使用 C 的内部 C++ 类类型?
- 具有模板类型内部功能的不同操作的NOExcept
- 在C++中,当两个向量类型不同时,如何将值存储到向量内部的向量中
- 如何将负数转换为更广泛的类型在内部工作
- 如何为模板的内部类型专用化类
- 从函数内部推断函数返回类型
- C 名称当前类型内部模板
- 从内部类型参数推断外部类型
- 从 lambda 内部返回 C++11 中的 lambda 类型(平面映射函数)
- 在 CUDA 中使用内部类型转换的奇怪错误