¿Todavía es posible personalizar el tipo de "referencia" del vector STL?
¿Es posible personalizar elreference
de unstd::vector
. Hasta C ++ 11 parecía posible a través deAllocator
parámetro de plantilla ¿Pero ya no más?
De acuerdo con la documentación,http://en.cppreference.com/w/cpp/container/vector, reference
ahora es siemprevalue_type
yvalue_type
es siempre el parámetro de plantillaT
.
Parece ser imposible incluso usarallocator_traits
, http://en.cppreference.com/w/cpp/memory/allocator_traits
¿Hay una solución para esto?
Si no, ¿significa que tengo que especializar todo elstd::vector
y probablemente reproduzca toda su funcionalidad si quiero tener un especialreference
tipo basado en el asignador?
Si es así, en general, ¿cuál es la lógica de todas estas restricciones? Para obligar al usuario a usarstd::vector<T, A>
para administrar siempre la memoria regular (en la cual,value_type = T
, reference = T&
ypointer = T*
?)
Nota: soy consciente de lastd::vector<bool>
controversia. Sin embargo, esto es un poco más general porque, en principio, necesito una costumbrestd::vector<RegularType, special_allocator<RegularType>>
principalmente para controlar el tipo de retorno deoperator[](int)
a un objeto proxy especial.
Implementación específica: estoy mirando la fuente stdlib de GCC 6.3.1 y enstd_vector.h
uno puede leer:
template<typename _Tp, ...>
class vector : ...{
...
public:
typedef typename _Alloc_traits::reference reference;
};
lo que parece indicar que todavía es posible especificar un tipo de referencia a través deallocator
(_traits
?)
De acuerdo con la documentación,allocator
o laallocator_traits
no necesita tener unreference
tipo. Además, no sé cómo personalizar este tipo de todos modos.
¿GCC no sigue el estándar? ¿O es simplemente que indirectamenteallocator_traits<Allocator>::reference
se ve obligado a serallocator_traits<Allocator>::value_type&
?