什么是完整类型(complete type)? 要明白这个概念不如先从不完整类型(incomplete type)开始. 简单说,如果在编译期编译器能计算出一个类型的size,那么它就是一个完整类型,否则就是不完整类型。
比如如下的向前声明,编译器遇到它时,并无法判断student这个类型有占用多大的空间,所以它就是一个不完整类型:
struct student *ps;
当编译器遇到student的定义时它就成了一个完整类型
struct student
{
int num;
} /* student structure now completed */
ok,现在我们搞明白了完整类型的概念,那么在C++11中如何判断 一个类型是完整类型呢?
只要对一个类型sizeof(T)能正确计算,这个T就是一个完整类型。
所以判断T是否为完整类型的模板函数就可以写成如下的样子:
// 根据SFINAE原则,sizeof(T)不能正确计算就进入此分支,value为false;
template <typename T, typename = void>
struct is_complete_type : std::false_type {};
// sizeof(T)能正确计算就进入此分支,value为true;
template <typename T>
struct is_complete_type<T, decltype(void(sizeof(T)))> : std::true_type {};
std::cout << "int is complete type: " << is_complete_type<int>::value << std::endl;
// output 1(true) for int
// 前向声明类型
struct other;
std::cout << "other is complete type: " << is_complete_type<other>::value << std::endl;
// output 0(false) for www forward declaration
《Incomplete Types》(https://docs.microsoft.com/en-us/cpp/c-language/incomplete-types?view=vs-2019)
《How to write is_complete
template?》(https://stackoverflow.com/a/37193089/4116453)