C++11模版元編程:如何判斷一個類型是完整類型(complete type)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章