#c #templates #typetraits
#c #шаблоны #признаки типов
Вопрос:
Могу ли я использовать признаки типа C , чтобы проверить, является ли тип контейнером, подобным STL? Я уже знаю о встроенном GCC __is_class
, но я хотел бы быть немного более конкретным, если это возможно.
Комментарии:
1. Определите, что означает «подобный STL».
2. @JohnPS: контейнер должен
value_type
,iterator
,const_iterator
,reference
,const_reference
,pointer
,difference_type
,size_type
,begin()
,end()
,size()
,max_size()
,empty()
, иswap()
, и должен выполнить несколько других простых условий.3. Черт возьми, я думаю
std::forward_list
, тогда это не контейнер (у него нетsize()
). Моя точка зрения: в настоящее время я не знаю общепринятого определения контейнера.4. Возможно, вы могли бы извлечь уроки из проверок концепции, выполняемых в библиотеке Boost Range, или просто использовать их.
Ответ №1:
Вы могли бы создавать свои собственные классы признаков для проверки типа для интерфейса контейнера. Это потребовало бы проверки наличия определенных связанных типов (таких как container::iterator
) и проверки того, что определенные выражения (такие как container.empty()
) допустимы (т. Е. Они компилируются без ошибок). Различные методы SFINAE могут быть использованы для создания классов признаков, которые проверяют наличие вложенных типов и проверяют выражения.
На странице SGI подробно указаны связанные типы и допустимые выражения, которые должны предоставлять типы, моделирующие «концепцию» контейнера. Самый последний документ стандарта ISO C , вероятно, предоставит более авторитетный источник, поскольку страница SGI довольно старая.
Конечно, классы черт не могут проверять семантику выражений типа like container.empty()
; они могут только проверять, что выражения являются законными. Некоторые предложили расширить язык, чтобы позволить программисту утверждать семантические свойства выражений, что позволило бы устранить это ограничение.
Комментарии:
1. Отличный ответ с некоторыми полезными ссылками. Спасибо. См. Также Документацию по признакам Boost на boost.org/libs/type_traits/doc/html/index.html .