Следующая мета-функция вычисляет, если данный тип является случайным итератором доступа:мета функции с поведением по умолчанию на недостающем признаке и как обнаружить случайный доступ
template <class I>
struct is_random_access
: boost::is_convertible
< typename boost::iterator_traversal<I>::type
, boost::random_access_traversal_tag
>
{};
Теперь, конечно, это не будет работать, если I
не является итератором вообще, как нет boost::iterator_traversal<I>
.
Два независимых вопросы:
- Как сделать
is_random_access
возвращение ложным (а не ошибку компиляции), когдаI
не является итератор? - Это хороший способ определить, является ли итератор случайным доступом к переходу?
https://stackoverflow.com/questions/4307271/how-to-check-that-the-passed-iterator-is-a-random-access-iterator – Mine
1. Я не хочу отмечать отправку. Я хочу, чтобы мета-функция была спрошена, чтобы работать. 2. не является std :: random_access_iterator_tag подмножеством random_access_traversal_tags (т. Е. Существуют итераторы с обратным ходом случайного доступа, которые не являются std :: random_access_iterator_tag)? – Nick
Что-то вроде 'std :: условный> :: value, identity >, identity >> :: type :: type'. –
Jarod42