Tengo una función que necesita enumerar un iterador varias veces, pero according to MSDN, "Una vez que incrementa cualquier copia de un iterador de entrada, ninguna de las otras copias puede compararse, eliminarse o incrementarse con seguridad de allí en adelante". Para facilitar las cosas, en lugar de crear una implementación separada para los iteradores que duplican los datos y enumeran la copia, quiero restringir mi método a solo tomar adelante iteradores y rechazar iteradores de entrada estáticamente .Cómo restringir un iterador a ser un iterador directo?
Ahora mismo tengo algo como:
template<typename It, typename TCallback /*signature: bool(value_type)*/>
bool EnumerateTwice(const It &begin, const It &end, TCallback callback)
{
for (It it = begin; it != end; ++it)
if (!callback(*it))
return false;
for (It it = begin; it != end; ++it)
if (!callback(*it))
return false;
return true;
}
pero nada restringe It
a ser un iterador hacia adelante.
¿Cómo coloco esa restricción en la función de plantilla? (C++ 03)
+1 ¡Oooooo no sabía que los iteradores están etiquetados! Eso es bastante útil. ¡Muchas gracias! :) – Mehrdad
Esto rechazará los iteradores bidireccionales y de acceso aleatorio. Utilice 'is_base_of' en lugar de' is_same' para la semántica adecuada. – ildjarn
@ildjarn: Oh sí, buen punto; ¡Gracias! – Mehrdad