2015-10-30 47 views
0

如果t是char *或隱式或顯式重寫operator char *()的類,則第一個條件可正確運行。第二個條件的目標是在類型t是一個指針時,執行括號內的代碼,並且可以將t的解除引用類型轉換爲char *。第二個條件在它應該(例如char **應該評估爲true)時不成立。我究竟做錯了什麼?如何獲取模板參數的類型,當它包含一個指針?

F.Y.I:我只關心一個指針的東西,可以轉換爲一個char *像字符**,而不是與焦炭相關***,如果是有道理的。

t * Find(char * name) 
      { 
       if (std::is_convertible<t, char*>::value) 
       { 
        return 0; 
       } 
       else if (std::is_convertible<typename std::remove_pointer<t>::type, char * >::value) 
       { 
        return 0; 
       } 
       static_assert(false, "VSarray<T>::Find(char *), T is not convertable to a char *"); 
      } 
+0

如果你在靜態斷言失敗的基礎上,每次都會觸發,無論哪個分支將被採取。 – chris

+0

你能提供一個完整的例子來證明你的問題嗎?此外,你的'if's是編譯時間常量的條件不會阻止你的static_assert始終觸發。 – melak47

+0

@chris你是對的,我必須在重新測試之前改變靜態斷言中的條件。 – user3141117

回答

0

按預期工作。靜態斷言確保類型t(來自模板參數)可以轉換爲char *。該函數被分成兩個函數,當它是一個指向可以轉換爲char *的類型的指針時,允許類型t被解引用。

#define CHECK_TYPE_CONVERSION(TYPEFROM,TYPETO) std::is_convertible<TYPEFROM, TYPETO>::value 
#define CHECK_POINTER_TYPE_CONVERSION(TYPEFROM,TYPETO) std::is_convertible<std::remove_pointer<TYPEFROM>::type,TYPETO>::value 
    t * Find(char * name) 
    { 
     static_assert(CHECK_TYPE_CONVERSION(t,char*) || CHECK_POINTER_TYPE_CONVERSION(t,char*) 
      , "T cannot be converted to a char *"); 
     if (CHECK_TYPE_CONVERSION(t,char*) == false) 
      return this->FindFromPointer(name); 
     for (unsigned int i = 0; i < this->arraySize_; i++) 
     { 
      char * str = (char*)this->arrayData_[i]; 
      if (strcmp(str, name) == 0) 
       return &this->arrayData_[i]; 
     } 
     return 0; 

    } 


private: 
    t * FindFromPointer(char * name) 
    { 
     for (unsigned int i = 0; i < this->arraySize_; i++) 
     { 
      char * str = (char*)*this->arrayData_[i]; 
      if (strcmp(str, name) == 0) 
       return &this->arrayData_[i]; 
     } 
     return 0; 
    } 
相關問題