Obter um iterador reverso de um iterador avançado sem saber o tipo de valor

Estou tentando implementar alguns algoritmos de classificação no estilo STL. O protótipo parastd::sort parece algo como isto (decplusplus.com):

template <class RandomAccessIterator>
void sort ( RandomAccessIterator first, RandomAccessIterator last );

A função geralmente é chamada assim (embora o tipo de contêiner possa variar):

std::vector<int> myVec;
// Populate myVec
std::sort(myVec.begin(), myVec.end());

Eu dupliquei o protótipo destd::sort para minha própria função de classificação. Para percorrer o contêiner a ser classificado, faço o seguinte:

template <class RandomAccessIterator>
void mySort(RandomAccessIterator first, RandomAccessIterator last) {  
  RandomAccessIterator iter;
  for (iter = first; iter != last; ++iter) {
    // Do stuff
  }
}

Bastante fácil. Mas e se eu quiser usar um iterador reverso? Isto seria conveniente em algoritmos que ordenam um recipiente de ambas as extremidades, e.tipo de cocktail.

Existe alguma maneira de obter um iterador reverso dos iteradores que são passados ​​como parâmetros? Se eu soubesse o tipo de contêiner com antecedência, poderia fazer algo assim:

template <class RandomAccessIterator>
void mySort(RandomAccessIterator first, RandomAccessIterator last) {
  std::vector<int>::reverse_iterator riter(last);
  std::vector<int>::reverse_iterator rend(first);
  for ( ; riter != rend; ++riter) {
    // Do stuff
  }
}    

Infelizmente, eunão faça conheça o tipo de contêiner. O que eu realmente preciso fazer é algo assim:

template <class RandomAccessIterator>
void mySort(RandomAccessIterator first, RandomAccessIterator last) {
  RandomAccessIterator riter = reverse_iterator(last);
  RandomAccessIterator rend = reverse_iterator(begin);
  for ( ; riter != rend; ++riter) {
    // Do stuff
  }
}

Existe alguma maneira de fazer isso sem ter que passar em iteradores reversos como parâmetros adicionais (o que resolveria o problema, mas tornaria o protótipo da função menos intuitivo)?

Note que eu preciso de ambos para frentee inverter iteradores na minha implementação, então chamar a função dessa maneira

std::vector<int> myVec;
// Populate myVec
mySort(myVec.rbegin(), myVec.rend());

não funciona.

questionAnswers(2)

yourAnswerToTheQuestion