2015-10-30 4 views
0

Первое условие работает правильно, если t является символом char * или классом, который переопределяет оператор char *() неявно или явно. Цель второго условия состоит в том, чтобы выполнить код в скобках, когда тип t является указателем, а разыменованный тип t может быть преобразован в char *. Второе условие не выполняется, когда оно должно (например, t char ** должно оцениваться как true). Что я делаю не так?Как получить тип аргумента шаблона, когда он состоит из указателя?

F.Y.I .: Меня интересует только один указатель на то, что может быть конвертировано в char * как char ** и не связано с 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

Можете ли вы представить полный пример, демонстрирующий вашу проблему? Кроме того, условия ваших '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' – melak47

+0

@chris вы были правы, я должен был изменить условие внутри статического утверждения до повторного тестирования. – user3141117

ответ

0

Работы по назначению. Статическое утверждение гарантирует, что тип t (из аргумента шаблона) можно преобразовать в char *. Функция разделяется на две функции, позволяющие разыменовать тип t, когда это указатель на тип, который может быть преобразован в char *.

#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; 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^