primero tendría una forma de determine if an iterator is a reverse one, que era ingeniously shown here:
#include <iterator>
#include <type_traits>
template<typename Iter>
struct is_reverse_iterator : std::false_type { };
template<typename Iter>
struct is_reverse_iterator<std::reverse_iterator<Iter>>
: std::integral_constant<bool, !is_reverse_iterator<Iter>::value>
{ };
entonces se podría tiene dos sabores para realizar la prueba
template<bool isRev> // for normal iterators
struct is_last_it
{
template<typename It, typename Cont>
static bool apply(It it, Cont const &cont)
{ // you need to test with .end()
return it != cont.end() && ++it == cont.end();
}
};
template<> // for reverse iterators
struct is_last_it<true>
{
template<typename It, typename Cont>
static bool apply(It it, Cont const &cont)
{ // you need to test with .rend()
return it != cont.rend() && ++it == cont.rend();
}
};
Y una sola función de interfaz
template<typename It, typename Cont>
bool is_last_iterator(It it, Cont const &cont)
{
return is_last_it<is_reverse_iterator<It>::value>::apply(it, cont);
};
A continuación, para cada tipo de iterador (inversa/derecho), puede utilizar la función de interfaz
int main()
{
std::vector<int> v;
v.push_back(1);
auto it (v.begin()), ite(v.end()); // normal iterators
auto rit(v.rbegin()), rite(v.rend()); // reverse iterators
std::cout << is_last_iterator(it, v) << std::endl;
std::cout << is_last_iterator(ite, v) << std::endl;
std::cout << is_last_iterator(rit, v) << std::endl;
std::cout << is_last_iterator(rite, v) << std::endl;
return 0;
}
en cuenta que algunos aplicación (aparte de std::begin()
y std::end()
que son lo suficientemente comunes, también incluyen std::rbegin()
y std::rend()
.Siempre que sea posible utilizar este conjunto de funciones en lugar de miembro de .begin()
etc.
Algo parece feo aquí. No obstante, sugiero que no es la forma de determinar si 'itr' apunta al último elemento. Lo feo es que necesitas saber si 'itr' apunta al último elemento. –
@John: puede que tengas razón. Tal vez tendría más sentido comprobar usando: 'if (Mine.Length()! = 0 && & Mine [Mine.Length() - 1] == itr)', o algo así. –
Hmm, mi respuesta es fea también. Debería haber sido la primera sugerencia de GMan: 'if (& Mine.back() == itr)'. –