Ver Mensaje Individual
  #1 (permalink)  
Antiguo 14/10/2014, 12:58
alexpglez98
 
Fecha de Ingreso: octubre-2014
Mensajes: 23
Antigüedad: 10 años, 1 mes
Puntos: 0
Pregunta comparar dos tipos de datos y crear uno nuevo eligiendo el mayor

Querría preguntar sobre cómo poder comparar dos tipos de datos, devolver un indicador con el mayor y crear un nuevo dato con el tipo de dato elegido. Por ejemplo, para sumar C++ crea un dato nuevo con el tipo del numerador más completo.
Mi duda sería como hacerlo. He hecho ya mi propio código que compara dos tipos de datos, lo que me falla es a la hora de crear el nuevo dato, me dice que hay declaraciones en conflicto:
Código C++:
Ver original
  1. template<class T>
  2. template<typename T_1, typename T_2>
  3. Matrix<T_2> Matrix<T>::operator + (const Matrix<T_1> &m_2)
  4. {
  5.     T c;
  6.     T_1 b;
  7.     char a=compare(b,c);
  8.     switch(a)
  9.     {
  10.         case 's':
  11.             Matrix<short> result(I, J);
  12.             break;
  13.         case 't':
  14.             Matrix<unsigned short> result(I, J); // declaración en conflicto
  15.             break;
  16.         case 'i':
  17.             Matrix<int> result(I, J);
  18.             break;
  19.         case 'j':
  20.             Matrix<unsigned int> result(I, J);
  21.             break;
  22.         case 'l':
  23.             Matrix<long> result(I, J);
  24.             break;
  25.         case 'm':
  26.             Matrix<unsigned long> result(I, J);
  27.             break;
  28.         case 'x':
  29.             Matrix<long long> result(I, J);
  30.             break;
  31.         case 'y':
  32.             Matrix<unsigned long long> result(I, J);
  33.             break;
  34.         case 'f':
  35.             Matrix<float> result(I, J);
  36.             break;
  37.         case 'd':
  38.             Matrix<double> result(I, J);
  39.             break;
  40.         case 'e':
  41.             Matrix<long double> result(I, J);
  42.             break;
  43.     }
  44.     for(int i=0; i<I; i++)
  45.     {
  46.         for(int j=0; j<J; j++)
  47.         {
  48.             result.value(i,j)=this->value(i,j)+m_2.value(i,j);
  49.         }
  50.     }
  51.     return result;
  52. }
Adjunto las funciones de compare por si les queréis echar un vistazo.
Código C++:
Ver original
  1. template<typename D_1, typename D_2>
  2. char compare(D_1 a, D_2 b)
  3. {
  4.     return is_data(fmax(range(typeid(a).name()), range(typeid(b).name())));
  5. }r
  6.  
  7. char is_data(int a)
  8. {
  9.     char data;
  10.     switch(a)
  11.     {
  12.         case 1:
  13.             data='s';
  14.             break;
  15.         case 2:
  16.             data='t';
  17.             break;
  18.         case 3:
  19.             data='i';
  20.             break;
  21.         case 4:
  22.             data='j';
  23.             break;
  24.         case 5:
  25.             data='l';
  26.             break;
  27.         case 6:
  28.             data='m';
  29.             break;
  30.         case 7:
  31.             data='x';
  32.             break;
  33.         case 8:
  34.             data='y';
  35.             break;
  36.         case 9:
  37.             data='f';
  38.             break;
  39.         case 10:
  40.             data='d';
  41.             break;
  42.         case 11:
  43.             data='e';
  44.             break;
  45.     }
  46.     return data;
  47. }
  48.  
  49.  
  50. int range(const char *name)
  51. {
  52.     int range;
  53.     switch(*name)
  54.     {
  55.         case 's':
  56.             range=1;
  57.             break;
  58.         case 't':
  59.             range=2;
  60.             break;
  61.         case 'i':
  62.             range=3;
  63.             break;
  64.         case 'j':
  65.             range=4;
  66.             break;
  67.         case 'l':
  68.             range=5;
  69.             break;
  70.         case 'm':
  71.             range=6;
  72.             break;
  73.         case 'x':
  74.             range=7;
  75.             break;
  76.         case 'y':
  77.             range=8;
  78.             break;
  79.         case 'f':
  80.             range=9;
  81.             break;
  82.         case 'd':
  83.             range=10;
  84.             break;
  85.         case 'e':
  86.             range=11;
  87.             break;
  88.     }
  89.     return range;
  90. }

Supongo que existirá alguna manera que desconozco de simplificar el código.
Gracias.