Можно ли использовать признаки типа, чтобы проверить, является ли тип контейнером?

#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 .