2009-09-30 2 views
3

Чтобы получить «более простой для запоминания» интерфейс для функции генерации индекса std :: distance (a, b), я подошел с помощью идея лучшего различения это аргументы (при использовании против основания вектора: vec.begin()) путем вызова шаблонный функции с вектором и его итератора, как:std :: vector и его итератор как единый шаблон typename

std::vector<MyType> vect; 
std::vector<MyType>::const_iterator iter; 
... 
... 
size_t id = vectorindex_of(iter, vect); 

с обоснование того, чтобы никогда не вводить в заблуждение порядок аргументы ;-)

Явная формулировка вышеприведенной идеи будет читать sth. например

template <typename T> 
inline 
size_t vectorindex_of( 
      typename std::vector<T>::const_iterator iter, 
      const std::vector<T>& vect) { 

    return std::distance(vect.begin(), iter); 
} 

... который работает, но выглядит неудобно.

Я хотел бы иметь механизм шаблонов неявно выводим типам как (псевдо-код):

template <typename T> 
inline 
size_t vectorindex_of(T::const_iterator iter, const T& vect) { 
    return std::distance(vect.begin(), iter); 
} 

... который не работает. Но почему?

ответ

8

Исправить легко: добавьте typename до T::const_iterator iter. Это необходимо, потому что шаблоны классов могут быть специализированными, а использование typename сообщает компилятору, что имя типа ожидается в T::const_iterator, а не значение или что-то в этом роде.

Вы делаете то же самое и в своей менее общей функции.

2
template <typename T> 
inline 
std::size_t vectorindex_of(typename T::const_iterator iter, const T& vect) { 
    return std::distance(vect.begin(), iter); 
} 

Должен работать нормально (обратите внимание на typename). Аргументы шаблона должны быть выведены в обоих случаях.

+0

Спасибо за указание этого простого исправления. Я бы хотел отметить оба ваши ответа как «принятый ответ», но возможно только одно ;-) –

1

Вы также можете быть заинтересованы в «проще для запоминания» способ получить индекс векторного итератора:

я - vec.begin()

Это идентичный указатель арифметика со случайными итераторы доступа!

Смежные вопросы