什麼是完整類型(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)