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
dynamic<int, float, char> a; 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
#include <iostream> template <typename... Types> union dynamic; // undefined template <> union dynamic<> { }; // empty tuple template <typename Head, typename... Tail> union dynamic<Head, Tail...> { typedef Head type; Head first_elem; dynamic<Tail...> rest; }; // definición de dynamic_element para conseguir el tipo de retorno de la función `get` template<size_t, typename> struct dynamic_element; template<typename T, typename... Ts> struct dynamic_element<0, dynamic<T, Ts...>> { typedef T type; }; template <size_t N, typename T, typename... Ts> struct dynamic_element<N, dynamic<T, Ts...>> { typedef typename dynamic_element<N-1,dynamic<Ts...>>::type type; }; // definición de la función `get` que obtiene el n-simo miembro de la union template <typename T, typename... Ts> typename dynamic_element<0, dynamic<T, Ts...> >::type& get(dynamic<T, Ts...>& tpl) noexcept { return tpl.first_elem; } template <size_t N, typename T, typename... Ts> typename dynamic_element< N, dynamic<T, Ts...> >::type& get(dynamic<T, Ts...>& tpl) noexcept { return get<N-1>(tpl.rest); } int main() { dynamic<int,char> test; auto& num = get<0>(test); //num = 5; return 0; }
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!