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

¡Genial!

Esto ya empieza a tener cara y ojos:

Código C++:
Ver original
  1. #include <type_traits>
  2.  
  3. template <typename... Ts> union variant {};
  4.  
  5. template<>
  6. union variant<> {
  7.     public:
  8.         template<typename U>
  9.         variant(const U&) {};
  10. };
  11.  
  12. template<typename T, typename... Ts>
  13. union variant<T, Ts...>
  14. {
  15.     public:
  16.         template<typename U, typename std::enable_if<std::is_same<U, T>::value, int>::type = 0>
  17.         variant(const U& u) : head(u) { }
  18.  
  19.         template<typename U, typename std::enable_if<!std::is_same<U, T>::value, int>::type = 0>
  20.         variant(const U& u) : tail(u) { }
  21.  
  22.         T head;
  23.         variant<Ts...> tail;
  24. };
  25.  
  26. template<typename U, typename T, typename... Ts,
  27.     typename std::enable_if<std::is_same<U, T>::value, int>::type = 0>
  28. U get(const variant<T, Ts...>& vnt) {
  29.     return vnt.head;
  30. }
  31.  
  32. template<typename U, typename T, typename... Ts,
  33.     typename std::enable_if<!std::is_same<U, T>::value, int>::type = 0>
  34. U get(const variant<T, Ts...>& vnt) {
  35.     return get<U>(vnt.tail);
  36. }
  37.  
  38. int main() {
  39.     variant<double, int> x = 1.8;
  40.     std::cout << get<double>(x) << std::endl; // 1.8
  41.     std::cout << get<int>(x) << std::endl; // no se almacena igual un int que un double, sale un numero raro
  42.  
  43.     variant<double, int> y = "blabla"; // esto debería dar error pero no lo da.
  44.     //std::cout << get<unsigned>(x) << std::endl; // esto da error por no existir unsigned
  45.     return 0;
  46. }

Ahora toca pensar como restringir el numero de constructores a los definidos en el template.

Muchas gracias, eferion.
__________________
github.com/xgbuils | npm/xgbuils