2012-10-10 71 views
5

El siguiente código compila bien en mi sistema:Iteradores a matrices de diferentes tamaños

#include <array> 
#include <type_traits> 

static_assert(std::is_same<std::array<int, 5>::iterator, 
          std::array<int, 7>::iterator>::value, ":("); 

es que el comportamiento que garantiza el estándar? ¿El tipo de iterador es independiente del tamaño de la matriz?

Si está garantizado, ¿hay alguna forma de abstraer del tipo de elemento e ignorar el tamaño?

template<typename T, size_t n> 
void foobar(std::array<T, n>::iterator it) 

Es decir, ¿hay alguna manera de escribir el código específica de la matriz anterior sin mencionar el tamaño n?

Tenga en cuenta que no deseo recurrir a T*, aunque en modo de lanzamiento el iterador probablemente sea T*.

+0

¿Qué pasa con 'template void foobar (Itearator_type it)'? – Lol4t0

+1

@ Lol4t0 ¿Es demasiado general y no satisface mi sed de conocimiento? – fredoverflow

+0

Quiero decir, si el código funciona para _given_ iterator, ¿por qué debería uno imponer una limitación artificial? Estos 2 comentarios solo están relacionados con la última sección de tu pregunta, de la causa. – Lol4t0

Respuesta

3

No, no se garantiza. Cada tipo de matriz array<T, size_t> tiene un miembro anidado typedef llamado iterator cuyo tipo es implementación definida.

1

La respuesta simple es hacerlo un poco más genérico. ¿Por qué solo quieres permitir iteradores desde std::array?

template <typename Iterator> 
void foobar(Iterator it) 

En la segunda pieza de código, el tamaño de letra T y n se encuentran en un contexto no deducible. Conceptualmente múltiples tipos std::array podría tener el mismo tipo iterator, o como lo mencionas solo puede ser T*, y sería imposible encontrar lo que sea posible std::array tenían un T* como iterator

+0

De hecho, la respuesta * actual * es incluso * más simple *: *" No, esto no está garantizado por el estándar. "* –

4

No, no hay garantías. La norma sólo dice

typedef implementation-defined iterator; 

El tipo de iterador podría ser un puntero normal, una clase que es un miembro de la array, o una clase separada envolver el puntero sin formato.

Si es una clase de miembro, será según el tamaño de la matriz. De lo contrario, probablemente no.

Cuestiones relacionadas