Introducción a la programación genérica (V)

Artículos de la serie:

Literales definidos por el usuario

 
Siendo el conjunto de números reales R isomorfo al subconjunto {(x, 0) : x∈ R}⊂ C, e introduciendo la denominada unidad imaginaria i = (0, 1)∈ C, se tiene que todo número complejo z = (x,y)∈ C admite ser expresado en forma binómica como:

z = (x, y) = (x, 0) + (0, y) = (x, 0) + (0, 1)•(y, 0) = x + iy.

Esta notación, especialmente conveniente al operar con números complejos, es fácilmente implementable en el lenguaje C++. Así, podemos introducir un operador literal [1] que transforme un literal numérico de tipo double seguido del sufijo _i en un objeto de tipo Complex<double> puramente imaginario (es decir, con parte real nula): 

   constexpr auto operator""_i(long double im) noexcept -> Complex<double>    {       return {0.0static_cast<double>(im)};    }

Debido a las restricciones impuestas por el lenguaje sobre los operadores literales, el parámetro de la función debe ser de tipo unsigned long long o long double. En nuestro caso, hemos empleado este segundo tipo dada su mayor precisión. Los sufijos sin guión bajo precedente (por ejemplo, operator""i para números complejos) se encuentran reservados por el estándar del lenguaje.

Así, un número complejo puede ser inicializado en la forma:

   auto z = 1.0 + 2.0_i; // equivalente a: auto z = Complex<double>{1.0, 2.0};

Análogamente, podríamos introducir nuevos sufijos _if y _il para operar con los tipos Complex<float> y Complex<long double>, respectivamente.


Referencias bibliográficas:
  1. User-defined literal - https://en.cppreference.com/w/cpp/language/user_literal

No hay comentarios:

Publicar un comentario