Ver Mensaje Individual
  #1 (permalink)  
Antiguo 30/11/2014, 05:11
Pantaláimon
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 17 años, 9 meses
Puntos: 32
Crear plantilla dynamic. Lo que viene a ser tuple para struct, hacerlo para union.

Buenas,

Leyendo el hilo sobre Crear una mascara.... Vi la implementación de eferion de la clase Variant y se me ocurrió crear una clase con variadic templates que hiciera lo mismo que la clase std::tuple de C++, pero en este caso, usando como base para la implementación union en vez de struct. Puediendo así crear una unión de tipos distintos así:

Código C++:
Ver original
  1. dynamic<int, float, char> a;
  2. dynamic<int, std::string> b;

El problema es que yo nunca he profundizado en el tema de variadic templates, y me cuesta hacer la implementación. A ver si con la implementación de este ejemplo acabo aclarando algunas cosas sobre este tema. Me he bloquedado con lo siguiente:

Código C++:
Ver original
  1. #include <iostream>
  2.  
  3. template <typename... Types>
  4. union dynamic; // undefined
  5.  
  6. template <>
  7. union dynamic<> { }; // empty tuple
  8.  
  9. template <typename Head, typename... Tail>
  10. union dynamic<Head, Tail...> {
  11.     typedef Head type;
  12.  
  13.     Head first_elem;
  14.     dynamic<Tail...> rest;
  15. };
  16.  
  17. // definición de dynamic_element para conseguir el tipo de retorno de la función `get`
  18. template<size_t, typename> struct dynamic_element;
  19.  
  20. template<typename T, typename... Ts>
  21. struct dynamic_element<0, dynamic<T, Ts...>>
  22. {
  23.     typedef T type;
  24. };
  25.  
  26. template <size_t N, typename T, typename... Ts>
  27. struct dynamic_element<N, dynamic<T, Ts...>>
  28. {
  29.     typedef typename dynamic_element<N-1,dynamic<Ts...>>::type type;
  30. };
  31.  
  32. // definición de la función `get` que obtiene el n-simo miembro de la union
  33. template <typename T, typename... Ts>
  34. typename dynamic_element<0, dynamic<T, Ts...> >::type& get(dynamic<T, Ts...>& tpl) noexcept {
  35.     return tpl.first_elem;
  36. }
  37.  
  38. template <size_t N, typename T, typename... Ts>
  39. typename dynamic_element< N, dynamic<T, Ts...> >::type& get(dynamic<T, Ts...>& tpl) noexcept {
  40.     return get<N-1>(tpl.rest);
  41. }
  42.  
  43. int main() {
  44.     dynamic<int,char> test;
  45.     auto& num = get<0>(test);
  46.     //num = 5;
  47.     return 0;
  48. }

La implementación de dynamic y dynamic_element las he implementado casi calcadas de ejemplos que he encontrado por internet al ver que mis intentos de implementarlas eran infructuosos. La función get, la he implementado intentando seguir el mismo patrón, pero claro, con la diferencia de que estoy implementando una función. Pero algo he hecho mal.

A ver si algún experto me podría ayudar a entender que hago mal.

Un saludo y gracias!
__________________
github.com/xgbuils | npm/xgbuils