2010-07-22 8 views
8

Digamos que usted tiene un C++ 0x miembro de std :: matriz de una clase de plantilla y desea inicializar por medio de un constructor que toma un par de iteradores:En la inicialización de std :: gama

template <typename Tp, size_t N> 
class Test 
{ 
public: 
    template <typename Iterator> 
    Test(Iterator first, Iterator last) 
    { 
     if (std::distance(first,last) > N) 
      throw std::runtime_error("bad range"); 
     std::copy(first, last, _M_storage.begin()); 
    } 

private: 
    std::array<Tp, N> _M_storage; 

}; 

Suponiendo que está proporcionando un rango congruente con el tamaño de su almacenamiento, ¿es posible inicializar std :: array en el inicializador del constructor, evitando los constructores superfluos predeterminados de Tps en el almacenamiento? ¿Es posible explotar std :: initializer_list <> en este caso?

+1

Por cierto, se reserva un identificador que comienza con un guion bajo y que está seguido de una letra mayúscula. Además, debe ser 'std :: distance (first, last)'. – GManNickG

+0

Supervisión fija. El problema con los constructores predeterminados adicionales sigue siendo ... –

Respuesta

3

std::array es un agregado, para que tenga ninguna funcionalidad especial como constructores que toman iteradores. (Esto realmente me sorprende, con la introducción de std::initializer_list No veo ningún daño en hacer otros constructores útiles. Tal vez una pregunta está en la tienda.)

Esto significa que la única manera de usar iteradores para copiar datos dentro de la matriz es iterar , y para hacer eso, el array debe estar ya construido y listo para usar.

Cuestiones relacionadas