Cita:
Iniciado por aguml ¿que cálculos va a hacer en tiempo de compilación?
Código C++:
Ver originalconstexpr unsigned long Exponente(int e)
{
return (e>0)? 10*Exponente(e-1) : 1;
}
template<int D> unsigned long Reemplazar(unsigned long valor, unsigned nuevoDigito)
{
unsigned long superior = valor / Exponente(D+1);
unsigned long inferior = valor % Exponente(D);
return (superior*10+nuevoDigito)*Exponente(D) + inferior;
}
El dígito a convertir tiene que ser conocido en tiempo de compilación y da la casualidad que
Exponente() está etiquetada como
constexpr. En consecuencia, las llamadas
Exponente(D) y
Exponente(D+1) se sustituirán por su correspondiente solución en tiempo de compilación.
Cita:
Iniciado por aguml ¿Podrías explicarme el comportamiento de la función recursiva Exponente? No entiendo su funcionamiento.
Código C++:
Ver originalconstexpr unsigned long Exponente(int e)
{
return (e>0)? 10*Exponente(e-1) : 1;
}
Imaginemos que llamamos a Exponente(3). Esto es lo que sucede:
- Exponente(3): e=3, luego e>0. Calculamos 10*Exponente(2)
- Exponente(2): e=2, luego e>0. Calculamos 10*Exponente(1)
- Exponente(1): e=1, luego e>0. Calculamos 10*Exponente(0)
- Exponente(0): e=0, return 1.
- Exponente(1): return 10*Exponente(0) = 10*1 = 10
- Exponente(2): return 10*Exponente(1) = 10*10 = 100
- Exponente(3): return 10*Exponente(2) = 10*100 = 1000
Un saludo.