Обнаружение типа - PullRequest
2 голосов
/ 09 октября 2010

Игнорировать этот вопрос, только что нашел ошибку в моем коде, отметьте, чтобы удалить его

Это из "Шаблоны - полное руководство" гл.19.2
Составные типы - это типы, созданные из других типов.Простые составные типы включают простые типы, типы указателей, ссылочные типы и даже типы массивов.Они построены из одного базового типа.Типы классов и типы функций также являются составными типами, но их состав может включать несколько типов (для параметров или членов).Простые составные типы могут быть классифицированы с использованием частичной специализации.Мы начнем с общего определения класса признаков, описывающего составные типы, отличные от типов классов и типов перечисления (последние обрабатываются отдельно):

// types/type2.hpp 
template<typename T> 
class CompoundT {           // primary template 
  public: 
    enum { IsPtrT = 0, IsRefT = 0, IsArrayT = 0, 
           IsFuncT = 0, IsPtrMemT = 0 }; 
    typedef T BaseT; //This suppose to be different
    typedef T BottomT; //to this! But is typedef'ed in the same way! FFS!
    typedef CompoundT<void> ClassT; 
}; 

Тип члена BaseT является синонимом для непосредственного типа, для котороготип параметра шаблона T строит.BottomT, с другой стороны, относится к окончательному типу без указателя, без ссылки и без массива, на котором построен T.Например, если T - int *, то BaseT будет int , а BottomT будет int.
Сделал это, попробовал это и угадай, что не работает.Для int ** BaseT - это int **, а для BottomT - то же самое.Для меня очевидно, что в книге есть ошибка.Как, черт возьми, один и тот же тип может быть разным?Для меня это не может.Я хотел бы знать, что должно быть там (в классе decl.), Чтобы оно заработало.
Спасибо.

1 Ответ

0 голосов
/ 09 октября 2010

ну где специализации? Да, это основной шаблон, который должен быть создан для несоставных типов, если я правильно понимаю. И, естественно, с этим шаблоном ничего не поделаешь. С другой стороны, давайте рассмотрим специализацию для указателей (для массивов и т. Д. Она похожа)

template<typename T> 
class CompoundT<T*> {           // specialization for pointers
  public: 
    enum { IsPtrT = 1, IsRefT = 0, IsArrayT = 0, 
           IsFuncT = 0, IsPtrMemT = 0 }; 
    typedef T BaseT;
    typedef typename CompoundT<BaseT>::BottomT BottomT; 
    typedef CompoundT<void> ClassT; //not sure what this is for
}; 

теперь для int ** baseT будет int *, а BottomT будет int. НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...