tupla de vectores de std::tuple
Estoy tratando de crear una tupla de vectores a partir de un std::tuple (Motivo: https://en.wikipedia.org/wiki/AoSandSoA) y llegué al siguiente código.
¿Alguien puede pensar en una solución más elegante y menos verbosa? PD: Estoy atascado con un compilador de C++14…
“`cpp
template<std::size_t n,="" class="" t,=""></std::size_t><class> class Allocator>
struct tuple_of_vectors {};
template<class t,=""></class><class> class Allocator>
struct tuple_of_vectors<1, T, Allocator>
{
using type = std::tuple<
std::vector<
typename std::tuple_element<0, T>::type
, Allocator<typename std::tuple_element<0,="" t="">::type>
>
<blockquote>
;
};
</blockquote>
template<class t,=""></class><class> class Allocator>
struct tuple_of_vectors<2, T, Allocator>
{
using type = std::tuple<
std::vector<
typename std::tuple_element<0, T>::type
, Allocator<typename std::tuple_element<0,="" t="">::type>
<blockquote>
,
std::vector<
typename std::tuple_element<1, T>::type
, Allocator<typename std::tuple_element<1,="" t="">::type>
;
};
</blockquote>
// y así sucesivamente…
template<class t,=""></class><class> class Allocator>
class series
{
public:
using tov_type = typename tuple_of_vectors<
std::tuple_size<t>{}, T, Allocator>::type;
<pre><code>tov_type tov_;
</code></pre>
};
“`
davy.ai
Este código utiliza la metaprogramación de plantillas para crear una estructura
tuple_of_vectors
basada en unastd::tuple
dada. Si bien el código puede funcionar, definitivamente se puede hacer menos verboso con características de C++17 comostd::apply
.Aquí tienes un ejemplo de una solución más elegante que funciona en C++14:
“`c++
#include
#include
template <typename… args=””>{}…);
auto tuple_to_vectors(const std::tuple<args…>& t) {
return std::make_tuple(std::vector
}
int main() {
std::tuple<int, float,=”” double=””> t{1, 2.0f, 3.0};
}
“`
Este código utiliza el constructor de
std::tuple
para crear una tupla de vectores vacíos con los mismos tipos que la tupla de entrada. Luego, con la ayuda de las asignaciones estructuradas de C++17, podemos asignar fácilmente estos vectores a variables y usarlos según sea necesario.</int,></args…></typename…>