elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Aporte] fixedInteger.h
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Aporte] fixedInteger.h  (Leído 2,519 veces)
Mario Olivera

Desconectado Desconectado

Mensajes: 108


Ser loco es pensar diferente.


Ver Perfil
[Aporte] fixedInteger.h
« en: 16 Mayo 2015, 23:15 pm »

 Hola gente, estuve codeando un .h, el cual previene que cuando esperamos un valor de tipo integer y nos ingresan un valor de tipo string no nos tire error, y nos cierre el programa, les dejo un video, y el .h abajo, con un main.cpp para ejemplo de su uso de datos.




Main.cpp

Código
  1. #include <iostream>
  2. using std::cout;
  3. using std::endl;
  4. using std::cin;
  5.  
  6. #include <string>
  7. using std::string;
  8. using std::getline;
  9.  
  10. #include "fixedInteger.h"
  11.  
  12. int main()
  13. {
  14. string numero;
  15.  
  16. cout <<"numero: ";
  17. getline(cin,numero);
  18. cout <<endl;
  19.  
  20. fixedInteger aplicacion(numero);
  21.  
  22. cin.get();
  23. return 0;
  24. }

fixedInteger.h


Código
  1. /*
  2. <<<<<<<<<<<FIXED INTEGER>>>>>>>>>>>>>>>>
  3.                                                                                                                                     Creado por: Mario Olivera
  4. MISION:
  5. •Solucionar el error de cuando esperamos un integer y nos dan un string :)
  6.  
  7. USO:
  8. •Use un objeto desde un .cpp ejemplo: "fixedInteger objeto(una variable string);"
  9. • Para obtener el numero integer, solo ponga "objeto.obtenerInteger();" ejemplo: int numero= objeto.obtenerInteger();
  10.  
  11. Atencion: si usted esta esperando un numero integer positivo podria poner un if en su .cpp, ejemplo: si el numero es negativo
  12. entonces ejecuto de nuevo las funciones de fixedInteger;
  13.  
  14. Nada Mas que decir, saludos! Mario Olivera.
  15. */
  16.  
  17.  
  18.  
  19. /////////////////////////////////////////////CODIGO ////////////////////////////////////////
  20.  
  21. #include <iostream>
  22. using std::cout;
  23. using std::endl;
  24. using std::cin;
  25.  
  26. #include <string>
  27. using std::string;
  28.  
  29. class fixedInteger
  30. {
  31. public:
  32. fixedInteger(string numero)
  33. {
  34. convertidor(numero);
  35. }
  36.  
  37. int obtenerInteger()
  38. {
  39. return numeroInteger;
  40. }
  41.  
  42.  
  43.  
  44.  
  45. void convertidor(string numero)
  46. {
  47. int ladoDelCuadrado=0;
  48. int cantidadDeCaracteres;
  49. int resultado=1;
  50. int i=1;
  51. string auxNumero= numero;
  52. string caracter;
  53. string primerCaracter;
  54. string aux;
  55. bool interruptor= false;
  56. bool negativo= false;
  57.  
  58.  
  59. cantidadDeCaracteres= (auxNumero.length());
  60.  
  61. auxNumero= "f" + auxNumero;
  62.  
  63. while (interruptor == false)
  64. {
  65. interruptor= true;
  66. if (cantidadDeCaracteres == 1)
  67. {
  68. caracter= auxNumero[1];
  69.  
  70. if (caracter == "0")
  71. {
  72. ladoDelCuadrado= 0;
  73. }
  74. else
  75. {
  76. if (caracter == "1")
  77. {
  78. ladoDelCuadrado= 1;
  79. }
  80. else
  81. {
  82. if (caracter == "2")
  83. {
  84. ladoDelCuadrado= 2;
  85. }
  86. else
  87. {
  88. if (caracter == "3")
  89. {
  90. ladoDelCuadrado= 3;
  91. }
  92. else
  93. {
  94. if (caracter == "4")
  95. {
  96. ladoDelCuadrado= 4;
  97. }
  98. else
  99. {
  100. if (caracter == "5")
  101. {
  102. ladoDelCuadrado= 5;
  103. }
  104. else
  105. {
  106. if (caracter == "6")
  107. {
  108. ladoDelCuadrado= 6;
  109. }
  110. else
  111. {
  112. if (caracter == "7")
  113. {
  114. ladoDelCuadrado= 7;
  115. }
  116. else
  117. {
  118. if (caracter == "8")
  119. {
  120. ladoDelCuadrado=8;
  121. }
  122. else
  123. {
  124. if (caracter == "9")
  125. {
  126. caracter= 9;
  127. }
  128. else
  129. {
  130. interruptor= false;
  131. }
  132. }
  133. }
  134. }
  135. }
  136. }
  137. }
  138. }
  139. }
  140. }
  141.  
  142. }
  143.  
  144.  
  145.  
  146. else
  147. {
  148. primerCaracter= auxNumero[1];
  149. aux= auxNumero[1];
  150. while (i < cantidadDeCaracteres)
  151. {
  152.  
  153. if ((aux == "+") || (aux == "-"))
  154. {
  155.  
  156. }
  157. else
  158. {
  159. resultado*= 10;
  160. }
  161. ++i;
  162. }
  163. i= 1;
  164.  
  165. caracter= auxNumero[i];
  166.  
  167. if (caracter == "+")
  168. {
  169. i++;
  170. }
  171. if (caracter == "-")
  172. {
  173. i++;
  174. negativo= true;
  175. }
  176.  
  177. while (i < cantidadDeCaracteres)
  178. {
  179. caracter= auxNumero[i];
  180. if (caracter == "0")
  181. {
  182.  
  183. if ((primerCaracter != "+") || (primerCaracter != "-"))
  184. {
  185. if (i > 1)
  186. {
  187. ladoDelCuadrado= ladoDelCuadrado + ( 0 * resultado);
  188. }
  189.  
  190. }
  191. else
  192. {
  193. if (i > 2)
  194. {
  195. ladoDelCuadrado= ladoDelCuadrado + ( 0 * resultado);
  196. }
  197. }
  198. resultado/= 10;
  199. }
  200. else
  201. {
  202. if (caracter == "1")
  203. {
  204. ladoDelCuadrado= ladoDelCuadrado + ( 1 * resultado);
  205. resultado/= 10;
  206. }
  207. else
  208. {
  209. if (caracter =="2")
  210. {
  211. ladoDelCuadrado= ladoDelCuadrado + ( 2 * resultado);
  212. resultado/= 10;
  213. }
  214. else
  215. {
  216. if (caracter == "3")
  217. {
  218. ladoDelCuadrado= ladoDelCuadrado + ( 3 * resultado);
  219. resultado/= 10;
  220. }
  221. else
  222. {
  223. if (caracter == "4")
  224. {
  225. ladoDelCuadrado= ladoDelCuadrado + ( 4 * resultado);
  226. resultado/= 10;
  227. }
  228. else
  229. {
  230. if (caracter == "5")
  231. {
  232. ladoDelCuadrado= ladoDelCuadrado + ( 5 * resultado);
  233. resultado/= 10;
  234. }
  235. else
  236. {
  237. if (caracter == "6")
  238. {
  239. ladoDelCuadrado= ladoDelCuadrado + ( 6 * resultado);
  240. resultado/= 10;
  241. }
  242. else
  243. {
  244. if (caracter == "7")
  245. {
  246. ladoDelCuadrado= ladoDelCuadrado + ( 7 * resultado);
  247. resultado/= 10;
  248.  
  249. }
  250. else
  251. {
  252. if (caracter == "8")
  253. {
  254. ladoDelCuadrado= ladoDelCuadrado + ( 8 * resultado);
  255. resultado/= 10;
  256. }
  257. else
  258. {
  259. if (caracter == "9")
  260. {
  261. ladoDelCuadrado= ladoDelCuadrado + ( 9 * resultado);
  262. resultado/= 10;
  263. }
  264. else
  265. {
  266. interruptor= false;
  267. }
  268. }
  269. }
  270. }
  271. }
  272. }
  273. }
  274.  
  275. }
  276. }
  277.  
  278.  
  279. }
  280. ++i;
  281.  
  282.  
  283. }
  284.  
  285. }
  286.  
  287. if (cantidadDeCaracteres != 1)
  288. {
  289. caracter= auxNumero.substr(2,cantidadDeCaracteres);
  290.  
  291. if ((caracter != "0") && (caracter != "1") && (caracter != "2")  && (caracter != "3")  && (caracter != "4")  && (caracter != "5")  && (caracter != "6")  && (caracter != "7")  && (caracter != "8")  && (caracter != "9"))
  292. {
  293. interruptor= false;
  294. }
  295.  
  296. if (interruptor == true)
  297. {
  298. caracter= auxNumero.substr(cantidadDeCaracteres);
  299.  
  300. if (caracter == "1")
  301. {
  302. ladoDelCuadrado= ladoDelCuadrado + 1;
  303. }
  304. else
  305. {
  306. if (caracter == "2")
  307. {
  308. ladoDelCuadrado= ladoDelCuadrado + 2;
  309. }
  310. else
  311. {
  312. if (caracter == "3")
  313. {
  314. ladoDelCuadrado= ladoDelCuadrado + 3;
  315. }
  316. else
  317. {
  318. if (caracter == "4")
  319. {
  320. ladoDelCuadrado= ladoDelCuadrado + 4;
  321. }
  322. else
  323. {
  324. if (caracter == "5")
  325. {
  326. ladoDelCuadrado= ladoDelCuadrado + 5;
  327. }
  328. else
  329. {
  330. if (caracter == "6")
  331. {
  332. ladoDelCuadrado= ladoDelCuadrado + 6;
  333. }
  334. else
  335. {
  336. if (caracter == "7")
  337. {
  338. ladoDelCuadrado= ladoDelCuadrado + 7;
  339. }
  340. else
  341. {
  342. if (caracter == "8")
  343. {
  344. ladoDelCuadrado= ladoDelCuadrado + 8;
  345. }
  346. else
  347. {
  348. ladoDelCuadrado= ladoDelCuadrado + 9;
  349. }
  350. }
  351. }
  352. }
  353. }
  354. }
  355. }
  356. }
  357.  
  358. }
  359. else
  360. {
  361.  
  362. cout <<"ingrese el valor nuevamente: ";
  363. getline(cin, auxNumero);
  364.  
  365. ladoDelCuadrado=0;
  366. resultado=1;
  367. i=1;
  368. interruptor= false;
  369. cantidadDeCaracteres= (auxNumero.length());
  370. auxNumero= "f" + auxNumero;
  371. }
  372.  
  373. }
  374. else
  375. {
  376. if (interruptor == false)
  377. {
  378. cout <<"ingrese el valor nuevamente: ";
  379. getline(cin, auxNumero);
  380.  
  381. ladoDelCuadrado=0;
  382. resultado=1;
  383. i=1;
  384. interruptor= false;
  385. cantidadDeCaracteres= (auxNumero.length());
  386. auxNumero= "f" + auxNumero;
  387. }
  388. }
  389. }
  390.  
  391. if (negativo == true)
  392. {
  393. ladoDelCuadrado= ladoDelCuadrado * -1;
  394. }
  395.  
  396. numeroInteger= ladoDelCuadrado;
  397. }
  398.  
  399. private:
  400. string mensajeError;
  401. int numeroInteger;
  402.  
  403. };


« Última modificación: 16 Mayo 2015, 23:19 pm por 718208 » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: [Aporte] fixedInteger.h
« Respuesta #1 en: 17 Mayo 2015, 01:48 am »

400 lineas para convertir un número de string a int es excesivo ·_·

Luego, obviando el uso abusivo de if-else, ten en cuenta que estás comparando strings de 1 caracter. Es más, llamas a una variable string "caracter". Puedes y deberías usar el tipo char.

PD: También existe la función stoi de la librería string (stoi, stoul, stof, ...)


En línea

Peregring-lk

Desconectado Desconectado

Mensajes: 50


Ver Perfil
Re: [Aporte] fixedInteger.h
« Respuesta #2 en: 17 Mayo 2015, 02:16 am »

¿Excesivo? Te quedas corto xD.

Es mucho más fácil y corto así:

Código
  1. #include <iostream>
  2. #include <stdexcept>
  3.  
  4. using namespace std;
  5.  
  6. int getNumero()
  7. {
  8.   int numero; cin >> numero;
  9.  
  10.   if (cin.fail())
  11.      throw domain_error("Hey!!! Eso no es un numero!!");
  12.  
  13.   char c; cin >> c;
  14.  
  15.   if (!cin.fail())
  16.       throw domain_error("Hey!!! Has escrito algo mas detras del numero!!");
  17.  
  18.   return numero;
  19. }
  20.  
  21. int main()
  22. {
  23.   while (true) { // Hasta que el numero no sea correcto, no te escapas.
  24.     try {
  25.          cout << getNumero() << endl;
  26.          break;
  27.     } catch (domain_error const& e) {
  28.         cerr << e.what() << endl;
  29.     }
  30.   }
  31.  
  32.   return 0;
  33. }
  34.  

Si estás empezando con C++ y te quedas un poco a cuadros con éste código (nadie ha dicho que C++ fuera fácil), pues ve investigando por Internet una a una las funciones y operadores que he utilizado aquí para que lo vayas desgranando, pero fundamentalmente, lo que veo que has malinterpretado es cómo se comportan los flujos en C++ (cin). Ellos ya hacen un montón de trabajo de parseo por tí.

Consejo: no reinventes la rueda. Cada vez que veas algo que sea simple, pero que implique mucho trabajo, seguramente ya esté hecho en algún lugar.

Mod: etiqueta GeSHi modificada, debe ser code=cpp, no code=c++
« Última modificación: 19 Mayo 2015, 09:09 am por engel lex » En línea

Gunhack

Desconectado Desconectado

Mensajes: 42



Ver Perfil
Re: [Aporte] fixedInteger.h
« Respuesta #3 en: 19 Mayo 2015, 04:50 am »

Se me hace más fácil esto  ;D
Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.  char datos[21];
  9.  int x;
  10.  
  11.  do{
  12.    cout << "Ingresa un numero: ";
  13.    cin.getline(datos,20);
  14.    x=atoi(datos);
  15.    if (x==0)
  16.      cout << "\nSolo ingresa numeros!!!\n\n";
  17.  }while(x==0);
  18.  
  19.  cout <<"El numero que ingresaste es: "<< x;
  20.  return 0;
  21. }
  22.  
  23.  
En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: [Aporte] fixedInteger.h
« Respuesta #4 en: 19 Mayo 2015, 09:08 am »

Se me hace más fácil esto  ;D


y si el numero ingresado es "0" o "0000000"?... son números validos
« Última modificación: 19 Mayo 2015, 09:14 am por engel lex » En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
Peregring-lk

Desconectado Desconectado

Mensajes: 50


Ver Perfil
Re: [Aporte] fixedInteger.h
« Respuesta #5 en: 19 Mayo 2015, 16:23 pm »

Si nos ponemos pedantes, ese código de Gunhack sufre dos defectos:

  • La operación de obtener el número y la de notificar al usuario del error y el reintento, están acoplados.
  • ¿Y si mañana quisieses cambiar el tipo de número a `unsigned`, `long long int` o `long double`?

En mi caso, bastaría con:

Código
  1. #include <iostream>
  2. #include <stdexcept>
  3.  
  4. using namespace std;
  5.  
  6. #define READ_TYPE int
  7.  
  8. template<typename Num_t>
  9. Num_t getNumero()
  10. {
  11.   Num_t numero; cin >> numero;
  12.  
  13.   // A partir de aquí, ya no hay más referencias al tipo.
  14.   if (cin.fail())
  15.      throw domain_error("Hey!!! Eso no es un numero!!");
  16.  
  17.   char c; cin >> c;
  18.  
  19.   if (!cin.fail())
  20.       throw domain_error("Hey!! Has escrito algo mas detras del numero!!");
  21.  
  22.   return numero;
  23. }
  24.  
  25. int main()
  26. {
  27.   while (true) { // Hasta que el número no sea correcto, no te escapas.
  28.     try {
  29.          cout << getNumero<READ_TYPE>() << endl;
  30.          break;
  31.     } catch (domain_error const& e) {
  32.         cerr << e.what() << endl;
  33.     }
  34.   }
  35.  
  36.   return 0;
  37. }
  38.  

Y el tipo que deseo obtener lo puedo especificar pasándole el valor de la macro al compilador (con la opción `-Dmacro=valor` en `gcc` si no me equivoco), así que no tengo que tocar el código si quiero cambiar el tipo.

En el caso de Gunhack, habría que cambiar el tamaño del búfer, y eso no es una tarea tan sencilla: ¿cuántos dígitos requiere un `long int`? http://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models Seguramente con metaprogramación, `constexpr`s y la librería `<climits>` se pueden obtener buenas cotas, pero ¿y qué pasa con números flotantes? En fin...

La ventaja del código de Gunhack, por otro lado, es que en caso error, su alternativa es claramente menos costosa que la basada en excepciones, pero a veces hay que sacrificar eficiencia a cambio de diseño.

Aunque bueno, éstas consideraciones se escapan al objetivo del ejercicio de Mario, pero he dicho al inicio de la respuesta que estamos en pedantic mode.
« Última modificación: 19 Mayo 2015, 16:34 pm por Peregring-lk » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: [Aporte] fixedInteger.h
« Respuesta #6 en: 19 Mayo 2015, 16:39 pm »

Con todo el respeto, de los códigos que se han aportado hasta ahora, ninguno tiene que ver con el post original.

El post original son métodos que convierten una string a un número, sin usar funciones de otras librerías con esa habilidad.

Al menos, proponed códigos que conviertan una cadena de caracteres en un entero :/

Edito:

Código
  1. #include <iostream>
  2. #include <cmath>
  3. #include <stdexcept>
  4.  
  5. using namespace std;
  6.  
  7. bool lessOrEqual(string a, string b){
  8.    if(a.size()<b.size()) return true;
  9.    if(a.size()>b.size()) return false;
  10.    if(a==b) return true;
  11.    for(int i=0; i<a.size(); i++)
  12.        if(a[i]<b[i]) return true;
  13.        else if(a[i]>b[i]) return false;
  14.    return true;
  15. }
  16.  
  17. int toInt(string str){
  18.    bool sign = str[0] == '-';
  19.  
  20.    for(int i=sign; i<str.size(); i++)
  21.        if(str[i]<'0' || str[i]>'9')
  22.            throw invalid_argument("Not numeric character found");
  23.  
  24.    size_t len = str.size()-sign;
  25.    if(sign)
  26.        str.erase(0,1);
  27.  
  28.    if(sign){
  29.        if(!lessOrEqual(str, "2147483648"))
  30.            throw out_of_range("Limits: [-2147483648, 2147483647]");
  31.    }else
  32.        if(!lessOrEqual(str, "2147483647"))
  33.            throw out_of_range("Limits: [-2147483648, 2147483647]");
  34.  
  35.    int temp = 0;
  36.    for(int i=str.size()-1; i>=0; i--)
  37.        temp += (str[i]-'0')*pow(10, str.size()-1-i);
  38.    if(sign)
  39.        temp *= -1;
  40.    return temp;
  41. }
  42.  
  43. int main(){
  44.    int number;
  45.    while(1){
  46.        cout << "Enter a number: ";
  47.        string temp;
  48.        getline(cin,temp);
  49.        bool good = true;
  50.        try{
  51.            number = toInt(temp);
  52.            break;
  53.        }catch(exception& e){
  54.            endl(cerr << "Exception: " << e.what());
  55.            endl(cout << "Invalid input.");
  56.        }
  57.    }
  58.    cout << "The number is: " << number;
  59. }
« Última modificación: 19 Mayo 2015, 17:28 pm por ivancea96 » En línea

Peregring-lk

Desconectado Desconectado

Mensajes: 50


Ver Perfil
Re: [Aporte] fixedInteger.h
« Respuesta #7 en: 19 Mayo 2015, 22:33 pm »

Ok. Aquí el mío, con las comprobaciones siguientes:

  • Detección de signo '+' (línea 34).
  • Escape de prefijo de 0s (línea 37).
  • Detección de número demasiado grande capturando desbordamiento (línea 15).
  • Paramétrico: acepta cualquier tipo númerico, sin importar si es signed o unsigned, ni su tamaño (short, long, long long), ni los detalles de la arquitectura: si la arquitectura utiliza complemento a dos para representar números, por ejemplo para el caso `sizeof(int) == 4`, el rango va desde -2^31 hasta 2^31-1, pero si utiliza complemento a uno, va desde -2^31+1 hasta 2^31-1, para números sin signo.
  • Si se desea un `unsigned`, pero se ha introducido el signo `-`, también lanza error (línea 31).
  • He hecho la función recursiva para ahorrar líneas (sustituir asignaciones por parámetros). No me gusta poner en foros códigos muy largos. De todas formas, el compilador seguramente la cambiará por una función iterativa sin mucho esfuerzo.

Código en coliru: http://coliru.stacked-crooked.com/a/bf7bfac2d1b46842 (haced click en `Edit` y cambiar la entrada por el número que queráis para probar el programa).

Aquí una lista de los límites numéricos según la arquitectura (sección Range of values): http://en.cppreference.com/w/cpp/language/types, por si queréis hacer pruebas.

Para cambiar el tipo que deseáis obtener, cambiad el que aparece en la línea 48: `getNum<tipo>(str)`.

Código
  1. #include <iostream>
  2. #include <stdexcept>
  3. #include <type_traits>
  4.  
  5. using namespace std;
  6.  
  7. template<typename Num_t> // Funcion recursiva, caracter a caracter.
  8. Num_t getNum(string const& str, Num_t num, signed char sign, size_t i, unsigned char nextc)
  9. {
  10.    if (i == str.size()) return num;
  11.    if (nextc > 9) throw invalid_argument("Eso no es un numero.");
  12.  
  13.    Num_t next = num * 10 + sign * nextc;
  14.  
  15.    if (sign == 1 ? (next < num) : (next > num))
  16.        throw invalid_argument("Numero demasiado grande.");
  17.  
  18.    return getNum(str, next, sign, i + 1, str[i + 1] - '0');
  19. }
  20.  
  21. template<typename Num_t>
  22. Num_t getNum(string const& str)
  23. {
  24.    if (str.size() == 0) throw invalid_argument("Introduzca un numero.");
  25.  
  26.    size_t i = 0;
  27.    signed char sign = 1;
  28.  
  29.    if (str[i] == '-') {
  30.        if (is_unsigned<Num_t>::value)
  31.            throw invalid_argument("Un numero natural no puede ser < 0.");
  32.  
  33.        ++i; sign = -1;
  34.    } else if (str[i] == '+')
  35.        ++i;
  36.  
  37.    while (str[i] == '0') ++i; // Ignoramos prefijo de 0s.
  38.  
  39.    return getNum<Num_t>(str, 0, sign, i, str[i] - '0');
  40. }
  41.  
  42. int main()
  43. {  
  44.    while (cin.good()) // Hasta que no me des un numero (y quede entrada) no te escapas.
  45.        try {
  46.            string str;
  47.            getline(cin, str); cin.ignore();
  48.            cout << getNum<unsigned>(str) << endl;
  49.            break;
  50.        } catch (invalid_argument const& e) {
  51.            cerr << e.what() << endl;
  52.        }
  53.  
  54.    return 0;
  55. }


Nota sobre chars: Mientras que el tipo `char` se utiliza para manipular carácteres, los tipos `signed char` y `unsigned char` se utilizan para manipular números de 1 byte (si `char` tiene signo o no, se deja a criterio del compilador). Si queréis utilizar éste programa para capturar números en el rango [-127, 127], [-128, 127] o [0, 255] (ya sabéis, números de 1 byte, signed/unsigned), la línea 48 no imprime el número, sino el carácter correspondiente devuelto por `getNum`. Tenéis que hacer un casting en ese caso a `int` por ejemplo para imprimir el número.

Aunque por supuesto, siempre hay solución para ello, sin tener que hacer casting manual :)

Código
  1. // Alias de `std::conditional`, para que `char2Short` y `RetNum` no queden muy largos.
  2. template<bool b, typename T, typename F>
  3. using conditional_t = typename conditional<b, T, F>::type;
  4.  
  5. // Transformacion char -> short conservando signo.
  6. template<typename T>
  7. using char2Short = conditional_t<is_signed<T>::value, short, unsigned short>;
  8.  
  9. // Nos aseguramos de devolver al menos un short, para que el
  10. // numero se imprima bien.
  11. template<typename T>
  12. using RetNum = conditional_t<sizeof(T) == 1, char2Short<T>, T>;
  13.  
  14. // Sobrecarga recursiva de `getNum` sin cambios, ya que si devolviese un `short` cuando
  15. // estamos trabajando con `char`s, podría fallar la comprobación de desbordamiento (no
  16. // estoy seguro en realidad).
  17.  
  18. template<typename Num_t>
  19. RetNum<Num_t> getNum(string const& str)
  20. { /* Implementacion */ }
  21.  
  22. // Main con getNum<char>(str) o getNum<signed char>(str), por ejemplo ...
« Última modificación: 19 Mayo 2015, 23:27 pm por Peregring-lk » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
pequeño aporte
Programación Visual Basic
demon_cry 0 1,184 Último mensaje 12 Junio 2006, 09:38 am
por demon_cry
pequeño aporte(proxy),pero aporte al fin.:D
Programación Visual Basic
Tengu 0 2,408 Último mensaje 22 Julio 2007, 17:33 pm
por Tengu
Aporte
Ingeniería Inversa
R6ID 0 2,193 Último mensaje 28 Febrero 2008, 11:35 am
por R6ID
Aporte c++
Programación C/C++
Stakewinner00 8 4,759 Último mensaje 2 Septiembre 2012, 08:33 am
por Stakewinner00
[Aporte] Aporte
Programación C/C++
Stakewinner00 3 2,501 Último mensaje 14 Noviembre 2012, 16:39 pm
por Stakewinner00
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines