Artículos de la serie:
- Un ejemplo sencillo: los números complejos
- Clases, atributos y funciones miembro
- Plantillas de clase
- Sobrecarga de operadores
- Literales definidos por el usuario
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.0, static_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:
- User-defined literal - https://en.cppreference.com/w/cpp/language/user_literal
No hay comentarios:
Publicar un comentario