#c #boost #typetraits
#c #увеличить #typetraits
Вопрос:
Я пытался просмотреть заголовки Boost type-traits и теперь чувствую себя довольно плохо, учитывая сильную нечитаемость, обеспечиваемую бесчисленными #define . И затем еще немного #define .
Чтобы быть конкретным, мне интересно выяснить следующие 3 признака: является ли тип T массивом, классом или перечислением.
Кто-нибудь может помочь предложить какой-нибудь способ расшифровки метода, стоящего за кажущимся безумием? Нравится теория, лежащая в основе определения признака по типу, любой соответствующий материал для чтения и т.д.
Комментарии:
1. Один из способов избавиться от бесчисленных ifdefs, которые вас беспокоят, — это запустить код через препроцессор, то есть использовать
-E
option withgcc
. Затем вы можете просмотреть код, который будет скомпилирован для вашей платформы вашим компилятором. Как правило, черты реализуются с использованием 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 они задокументированы здесь: Поддержка компилятором признаков типа