es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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>

};
“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Este código utiliza la metaprogramación de plantillas para crear una estructura tuple_of_vectors basada en una std::tuple dada. Si bien el código puede funcionar, definitivamente se puede hacer menos verboso con características de C++17 como std::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};

    auto [v1, v2, v3] = tuple_to_vectors(t);
    v1.push_back(10);
    v2.push_back(20.0f);
    v3.push_back(30.0);
    
    return 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…>

Comments are closed.