Cita:
Iniciado por enrieto P.D: y por favor, a los aconsejadores compulsivos les voy a pedir que tomen esto como una forma rápida y simple de responder a un par de preguntas, no pretendo hacer una próxima librería para las boost ni espero que nadie vaya a quere ampliar o mantener esto en el futuro, así que por favor no se molesten, cuando necesite un consejo voy a saber pedirlo solito
Más del 90% de las preguntas que se exponen en este foro las realiza gente que está aprendiendo a programar ya que las dudas de más nivel suele acabar en foros tipo stackoverflow (y en inglés para ser más precisos). Dado el gran volumen con un nivel bajo yo, personalmente, veo productivo intentar enseñar buenas prácticas que, todo sea dicho, los profesores suelen omitir, como evitar el uso de variables globales, evitar el uso de using namespace en las cabeceras, controlar los ciclos de vida de la memoria dinámica, entender que los objetos locales se pueden crear en la pila en vez de usar siempre new, las ventajas de usar referencias en vez de punteros y cosas así.
Los comentarios que se hagan sobre tu código no van dirigidos exclusivamente a tí si no a cualquiera que lea el hilo... si se personalizan con tu nombre es debido a comentarios que has realizado al respecto y poco más.
Yo personalmente celebro que seas de la gente que sabe buscarse la vida, pero no por ello has de privar a gente menos preparada que tu del derecho a tener diferentes puntos de vista para poder opinar en el futuro por sí mismos.
Por otro lado y venida a cuenta lo complicado que puede resultar la sintaxis de un puntero a función hemos de saber que tenemos disponible
std::function. ¿Ventajas de
std::function? Para mi las principales son una sintaxis algo más clara y que no hay que usar punteros, lo cual elimina la ambigüedad de los punteros a función. Además, dado que
std::function está bastante optimizado, lo normal es que el overhead al usar dicha función sea nulo o despreciable.
Tampoco penséis que
std::function es perfecto. Con funciones sobrecargadas da problemas, aunque hay soluciones para este problema puntual.
Código C++:
Ver original#include <iostream>
#include <string>
#include <functional>
#include <algorithm>
std::string ABinario(int numero)
{
std::string toReturn;
while( numero != 0 )
{
// & es un operador binario. XXXXXXY & 1 = XXXXXXY & 0000001 = Y
// Es una forma de obtener el bit menos significativo
int digito = (numero & 1);
// Convertimos
toReturn += (digito == 1)? '1' : '0';
// Eliminamos el digito que acabamos de procesar
// desplazando todos los bits a la derecha
numero >>= 1;
}
// Es necesario invertir la cadena para que el resultado sea correcto
std::reverse(toReturn.begin(), toReturn.end());
return toReturn;
}
std::string AHexadecimal(int numero)
{
char tabla[] = "0123456789ABCDEF";
std::string toReturn;
while( numero != 0 )
{
// Obtenemos los 4 bits menos significativos
int byte = (numero & 0xF);
// Convertimos
toReturn += tabla[byte];
// Eliminamos los 4 bits que acabamos de procesar
numero >>= 4;
}
// Como después vamos a invertir la cadena, insertamos la secuencia
// de inicio en orden inverso.
toReturn += "x0";
// Es necesario invertir la cadena para que el resultado sea correcto
std::reverse(toReturn.begin(), toReturn.end());
return toReturn;
}
int main()
{
// function almacenará punteros a funciones que retornan un string
// y que aceptan un único argumento de tipo int
// Al ser una clase, por lo que dispone de constructor, no es necesario
// hacer una inicialización a nullptr para evitar problemas.
std::function<std::string(int)> func;
func = ABinario;
std::cout << func(145) << std::endl;
func = AHexadecimal;
std::cout << func(145) << std::endl;
}
El ejemplo únicamente es compilable a partir del estándar C++11, que data del 2011 para que os hagáis una idea.
Un saludo.