Увеличить type_traits is_array

#c #boost #typetraits

#c #увеличить #typetraits

Вопрос:

Я пытался просмотреть заголовки Boost type-traits и теперь чувствую себя довольно плохо, учитывая сильную нечитаемость, обеспечиваемую бесчисленными #define . И затем еще немного #define .

Чтобы быть конкретным, мне интересно выяснить следующие 3 признака: является ли тип T массивом, классом или перечислением.

Кто-нибудь может помочь предложить какой-нибудь способ расшифровки метода, стоящего за кажущимся безумием? Нравится теория, лежащая в основе определения признака по типу, любой соответствующий материал для чтения и т.д.

Комментарии:

1. Один из способов избавиться от бесчисленных ifdefs, которые вас беспокоят, — это запустить код через препроцессор, то есть использовать -E option with gcc . Затем вы можете просмотреть код, который будет скомпилирован для вашей платформы вашим компилятором. Как правило, черты реализуются с использованием SFINAE, шаблонной (частичной) специализации и расширений, зависящих от компилятора.

2. 1 за ваше мужество погрузиться в заголовки boost. 😉 На самом деле я могу только рекомендовать это, особенно Boost. Заголовки функций для меня довольно познавательны.

Ответ №1:

is_array довольно просто и прямолинейно:

 template<class T>
struct is_array{
  static const bool value = false;
};

template<class T, std::size_t N>
struct is_array< T (amp;)[N] >{
  static const bool value = true;
};
  

Просто простая частичная специализация по типу ссылки на массив.

is_class немного сложнее и зависит от разрешения перегрузки и того факта, что классы и структуры обладают конструкторами (или деструкторами). Поскольку в данный момент я использую свой iPod Touch, я не могу показать пример. Я отредактирую один из них, как только у меня снова появится доступ к компьютеру.

is_enum я полагаю, полагается на встроенные функции компилятора, так что примера там нет.

Примечание: Все здесь по памяти, я мог ошибиться с перечислением.

Комментарии:

1. Вы правы насчет is_enum , и то же самое верно для is_pod .

2. @ildjarn: Я верю, что в Visual C каждая черта типа реализована с использованием встроенных в компилятор расширений, насколько я видел. В конце концов, компилятор лучше всех разбирается в типах, не так ли? :)

3. @Xeo : Я хотел сказать, что, в частности, эти две характеристики типа могут быть только реализованы с использованием встроенных в компилятор функций, в то время как остальные могут быть реализованы с помощью простых метафункций.

4. @ildjarn: Если бы я был сейчас за ПК, а не на своем iPhone, я бы воспринял это как вызов. 😉

5. @Fanatic23 : Для VC они задокументированы здесь: Поддержка компилятором признаков типа