<div dir="ltr">Hola Sergi,<br><div class="gmail_extra"><br><div class="gmail_quote">2015-04-18 9:46 GMT-04:00 Sergi <span dir="ltr"><<a href="mailto:sespinas6@gmail.com" target="_blank">sespinas6@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Buenas a todos,<br>
<br>
Tengo un problema con los typedefs, y es que no los uso porque creo que hago mal. Dentro de una clase, los usaría como en el ejemplo:<br>
[code]<br>
private:<br>
  template <typename T = unsigned char><br>
  using Element = std::pair<T, int>;1<br>
  using Vowels = std::vector<Element<>>;<br>
  using Diphthongs = std::vector<Element<std::array<unsigned char, 2>>>;<br>
  // etc<br>
[/code]<br>
Pero tengo la impresión de que, a pesar de ser alias privados (que sólo se usan dentro de la clase), estoy "escondiendo" información. Porque, aunque así escriba menos y el código sea más legible, Vowels es std::vector, con las mismas funciones miembro y demás. ¿No hace, entonces, el código más complicado de entender?<br>
<br></blockquote><div><br></div><div>Personalmente, no veo un grave problema por esconder esta información. Además, a veces viene bien, porque en una revisión futura del código, puedes decidir modificar la definición de 'Vowels' para que ahora sea la clase 'std::list', 'std::deque', o lo que quieras. Al usar una clase contenedora estándar, varios nombres de las funciones miembro son iguales, por lo que no sales perdiendo. Claro que siempre puedes decidir crear otra clase que sirva de "envoltura" para ofrecer la misma interfaz que 'vector'. Por otra parte, puedes ofrecer estas clases como parámetros de la plantilla; por ejemplo,</div><div><br></div><div>template< typename T = unsigned char, typename E = std::pair<T,int>, typename V = std::vector<E>, typename D = std::vector<E<std::array<T, 2>>> ></div><div>using Element = E;</div><div>...</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
¡Muchas gracias!<br>
<br>
PD:<br>
¿Qué opináis de "ushort" en vez de "unsigned short int", "uchar" en vez de "unsigned char"...?<br></blockquote><div><br></div><div>No es algo malo, pero personalmente no me gusta, porque no se agrega ninguna ventaja, excepto usar un nombre más corto. Sería más interesante si el nombre ofrece alguna información acerca del concepto que quieres plasmar; por ejemplo,</div><div><br></div><div>using cantidad_entera = unsigned short int;</div><div>using byte = unsigned char;</div><div><br></div><div>O incluso,</div><div><br></div><div>using int8 = char;</div><div>using int16 = short int;<br></div><div>using int32 = int;<br></div><div>using int64 = long long int;<br></div><div><br></div><div>Ahora tenemos una mejor idea de los requisitos de los tipos que podemos usar. Por cierto, estos nombres ya existen en C++11.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
Using y typedef pueden ser lo mismo.<br>
Ejemplo:<br>
[code]<br>
typedef unsigned short int ushort; [/code]<br>
[code]<br>
using ushort = unsigned short int [/code]<br><br></blockquote><div><br></div><div>Cierto, aunque la "nueva" sintaxis de 'using' acepta plantillas y sus parámetros, por lo que se trata de una extensión al funcionamiento de 'typedef'.</div><div><br></div><div><br></div><div>Hasta pronto,</div><div><br></div></div>Steven</div><div class="gmail_extra"><br></div></div>