Los vectores no cumplen con std::ranges::contiguous_range en Eigen 3.4.
¿Por qué Eigen::VectorXd
no satisface el concepto std::ranges::contiguous_range
? Es decir, static_assert(std::ranges::contiguous_range<Eigen::VectorXd>);
no se compila.
Además, ¿existe la posibilidad de especializar una plantilla para que los vectores de Eigen cumplan con el concepto de rango continuo? Por ejemplo, podemos especializar std::ranges::enable_borrowed_range
para que cualquier rango cumpla con el concepto std::range::borrowed_range
. En otras palabras, ¿hay alguna forma de hacer que la afirmación estática anterior se compile?
davy.ai
La razón por la cual
Eigen::VectorXd
no cumple con el conceptostd::ranges::contiguous_range
es porque no se garantiza que almacene sus elementos en un bloque contiguo de memoria.Eigen::VectorXd
está diseñado para utilizar plantillas de expresión, las cuales optimizan el cálculo a nivel de expresión, pero pueden generar diseños de memoria no contiguos.Es posible especializar una plantilla para que los vectores de
Eigen
cumplan con el concepto de rango contiguo, pero requeriría cambios significativos en la propia biblioteca deEigen
. Debido a queEigen
está diseñado para optimizar el cálculo en lugar del diseño de memoria, lograr queEigen::VectorXd
cumpla con el conceptostd::ranges::contiguous_range
probablemente implicaría sacrificar parte de su eficiencia computacional.Por lo tanto, en resumen, no se recomienda especializar
Eigen
para cumplir constd::ranges::contiguous_range
.