【发布时间】:2018-06-21 18:41:12
【问题描述】:
在“C++ 模板 - 完整指南 - 第二版”一书的第 19.8.4 章中,作者展示了如何在编译时确定一个类型是否是类类型:
#include <iostream>
#include <type_traits>
using namespace std;
template <typename T, typename = void_t<>>
struct IsClass : false_type { };
template <typename T>
struct IsClass<T, void_t<int T::*>> : true_type { };
int main()
{
struct S { };
cout << IsClass<S>::value; // prints 1
}
本段解释了偏特化如何检测类类型:
...只有类类型可以用作指向成员类型的基础。也就是说,在
X Y::*形式的类型构造中,Y只能是类类型。以下IsClass<T>的公式利用了该属性(并任意选择int类型X)
我不明白的是为什么选择int 为X 有效,即使我们使用完全没有成员的结构S 测试IsClass<>(它也适用于具有成员的类类型除了int)
【问题讨论】:
-
类不需要有成员来声明指向成员类型的指针。这类似于没有函数不会阻止声明指向函数类型的指针。
标签: c++ templates sfinae typetraits partial-specialization