Creación de sus propios UDL en c ++
La biblioteca estándar, junto con las características integradas de C ++, le proporcionan un interesante conjunto de literales. Sin embargo, el verdadero valor de los literales se hace más evidente cuando se crea el tuyo propio.
Conteúdo
Hay muchas necesidades diferentes que puede abordar mediante literales definidos por el usuario (UDL), pero tres necesidades comunes están apoyando las conversiones de datos, por lo que los tipos personalizados fáciles de trabajar, y la obtención de los efectos secundarios deseados sin el número habitual de problemas de codificación.
Aunque incorporado o literales Biblioteca Estándar vienen en forma de prefijo y sufijo, sólo se puede crear el formulario sufijo hora de definir sus propias literales. Además, el sufijo debe comenzar con un guión bajo. El guión sirve para ayudar a evitar conflictos con los sufijos existentes y garantizar otros desarrolladores saben que el literal es un formulario personalizado (no estándar).
El desarrollo de una conversión UDL
Es posible encapsular conversiones dentro de un UDL. Todo lo que tiene que hacer una vez que se crea un UDL es tal proporciona el sufijo correspondiente al definir la constante para obtener el resultado que desea. los CustomUDL01 ejemplo demuestra una técnica para la definición de una conversión que cambia el radio de entrada a la zona de un círculo en la constante.
#includeusing namespace std-constexpr largo doble operador "" _circ (doble largo radio) {return radio * radio * 3.141592-} int main () {double x = 5.0_circ-cout lt; lt; "El área del círculo es:" lt; lt; X lt; lt; endl retorno 0-}
Con el fin de crear la UDL, el ejemplo se basa en una constexpr con un valor de retorno de un long double y un valor de entrada, radio, de un long double. La ecuación para calcular el área de un círculo es # 960-r2. Como se puede ver, el ejemplo realiza el cálculo correcto como parte de la constexpr.
Siempre que se crea una costumbre UDL, los te obliga compilador que utilice el tipo más grande para la conversión. Lo que esto significa es que usted debe utilizar un long double para los literales de punto flotante y unsigned long long para los literales enteros. Incluso si más adelante decide utilizar un tipo más pequeño, como se hace en este ejemplo al declarar X como un doble, el propio literal debe emplear el mayor tipo posible.
Para declarar una UDL del nuevo tipo, el ejemplo crea X, que utiliza el _circ sufijo. A continuación, da salida a la pantalla resultado. Al ejecutar este ejemplo, se ve que el valor correcto se ha colocado en X, como se muestra aquí:
El área del círculo es: 78.5398
El desarrollo de un tipo personalizado UDL
Una gran parte del código que encuentra se basa en los tipos personalizados que son difíciles de seguir y entender. Creación de un UDL para simplificar el código hace que las cosas más clara y reduce el potencial de error. los CustomUDL02 ejemplo muestra un tipo personalizado, el operador usado para crear el UDL, así como cómo se utiliza la UDL para definir un literal.
#includeusing namespace std-struct MyType {MyType (doble entrada): Valor (Entrada) {} doble Valor -} - operador MyType "" _mytype (long double Value) {return MyType (Valor) -} int main () {auto UDLType = 145.6_mytype-cout lt; lt; UDLType.Value lt; lt; endl retorno 0-}
Para que esta técnica funcione, debe crear un constructor para su tipo que acepta la cantidad de insumos necesarios para configurar el tipo. Como mínimo, el constructor debe aceptar un tipo o el valor de entrada el usuario proporcione se pierde.
El tipo personalizado no tiene que apoyar el mismo tipo de datos de tamaño según sea necesario por el operador, sino que debe ser de la misma clase. Por ejemplo, no se podía transición de un long double a un int.
Al ejecutar este ejemplo, verá un valor de salida de 145,6, que es el valor que ingresa al tipo personalizado. Es posible manejar configuraciones bastante complejas utilizando este enfoque. El usuario de su tipo personalizado obtiene la capacidad de crear código claro que es fácil de seguir e interpretar, incluso cuando los tipos subyacentes son complejas.
Usando una costumbre UDL efectos secundarios
Uno de los usos más interesantes para UDL es crear efectos secundarios (una operación que no sea la operación habitual o normal, ya sea para hacer la aplicación más corto y más eficiente o para proporcionar flexibilidad añadida). Usted quiere definir un cierto tipo de operación que se lleva a cabo como consecuencia de la definición de lo literal.
Lo que se obtiene es aún un literal, sino un literal que no denota necesariamente un valor que planea utilizar más tarde. los CustomUDL03 ejemplo muestra un tal uso no tradicional.
#includeusing namespace std-vacío operador "" _countdown (Valor long long) {for (int i = Value- i> = 0- i -) cout lt; lt; yo lt; lt; endl-} int main () {10_countdown retorno 0-}
Observe que el _countdown operador no está unido a algo que que normalmente se asocia con un valor. De hecho, no se devuelve ningún valor en absoluto. Lo que se obtiene en cambio, es un efecto secundario. Al ejecutar este ejemplo, verá esta salida.
109876543210
Lo que ha sucedido es que el compilador ha reemplazado 10_countdown con persona cout declaraciones, uno para cada iteración del bucle. Lo que usted termina con es 11 cout declaraciones que imprimir los valores de entre 10 y 0 (en orden inverso). El efecto secundario UDL abre todo tipo de posibilidades interesantes para la creación de código que simplifica ciertas tareas repetitivas de una manera que hace que su uso obvio.