« first day (2535 days earlier)      last day (570 days later) » 

10:43 AM
Jellou
Gut mornin
 
 
8 hours later…
6:35 PM
@Trauma al compilar me aparece este error:
error: invalid initialization of reference of type ‘Evaluadores::Funcion&’ from expression of type ‘std::map<std::__cxx11::basic_string<char>, Token>::mapped_type’ {aka ‘Token’}
   40 |             if(variables.find(nombre) != variables.end()) return variables[nombre];
 
6:46 PM
@Christian ¿ Esto es nuevo o es relativo a la pregunta de antes ?
El error te dice que no puedes devolver una referencia a una clase hija desde una instancia de la clase base
 
@Trauma es de la pregunta. Hice todo lo que dijiste y ejecuté y apareció eso
 
Raro, a mi ni me salíó eso
miro tu código, 1 seg
Si Funciones hereda de Token, tu código debería funcionar. Monto un mcve y te digo
 
dale
El error aparece si agrego esta línea Funcion func = variables.operator[]<Funcion>("holas");
Si la quito todo anda
 
Claro
No puedes devolver un algo hijo a partir de un algo padre, como te dije antes
        if(variables.find(nombre) != variables.end()) return variables[nombre];
        return funciones[nombre];
En ese código, SI ENCUENTRA la cadena en el mapa, estarías devolviendo un Token
No puedes generar un Funcion desde un Token
Alrevés si
 
Sigo sin entender del todo
 
6:57 PM
No hay truco ni template que valga. Simplemente, no se puede.
 
    class Variables {
    private:
        map<string, Token> variables;
        map<string, Funcion> funciones;
    public:
        Variables() = default;

        int size(){ return variables.size(); }

        void agregar(string nombre, Token token) { variables[nombre] = token; }
        void agregar(string nombre, Funcion func) { funciones[nombre] = func; }

        template <class T>
        T& operator [](const string nombre) {
            if(variables.find(nombre) != variables.end()) return variables[nombre];
 
Eso funcionará mientras lo uses con Token
 
O_O
 
Si lo encuentras en variables, devuelves un Token. Y, si no lo encuentra, devuelves un Funcion, que es hijo de Token
 
ya veo
 
6:58 PM
Pero al reves no
Si tienes una clase Hola y una clase Pepe que hereda de Hola
lo normal es que Pepe tenga mas atributos que Hola
Por lo tanto, un Hola es un Pepe
Pero un Pepe no es un Hola, le faltarian atributos
 
y podría usar any y luego hacer un any_cast<Funcion>?
o que otra cosa podría hacer?
 
Supongo que si, que podrías usar un Any
Aunque lo mas sencillo sería que Token tuviera X metodos virtuales, y devolver siempre Tokens
Si te digo la verdad, hasta hoy, nunca he tenido que usar Any jejeje
 
Es que siempre devuelve un Token, mi único problema sería en la clase Función
Tuve que hacer cosas raras
class Funcion : public Token{
private:
    string nombre;
    map<string, Token> args;
    vector<Token> contenido;
    vector<Token> returned;
public:
    Funcion() = default;
    Funcion(string name, vector<Token> content, map<string, Token> args_);
    string getNombre();
    vector<Token> getContenido();
    vector<Token> getSentReturn();
    map<string, Token> getArgs();
    friend ostream& operator <<(ostream& os, const Funcion& func);
};
 
Si tuviste que hacer cosas raras, 99% de que está mal planteado
Entonces son solo 2 casos, ¿ no ? Token y Funcion
 
Por ahora sí
 
7:03 PM
Pues devuelve siempre un Token y comprueba en tiempo de ejecución
con un dynamic_cast, por ejemplo
 
eso me es nuevo
 
o le pones un método que te diga si es Token o Funcion
struct Token {
    Token( ) = default;

    IamFunction = false;

protected:
    Token( bool ) : IamFunction(true) { }
};

struct Funcion : public Token {
    Funcion( ) : Token( true ) { }
};
Con algo así, siempre trabajas con Token, pero puedes comprobar si es un Function y actuar en consecuencia
if( item.IamFunction ) {
    auto &funct = reinterpret_cast< Funcion & >( item );
} else {
    // Un Token
}
Hay muchas formas de hacerlo, en realidad :-)
 
mi cerebro ha petado
 
Pues son conceptos básicos de POO, herencia y tal
Piensa ... ¿ Como lo harías en python ?
No será muy diferente
Tendrás una clase Token y una clase Funcion igual
solo que en python no necesitarias el reinterpret_cast, si el método no existe, lanza una excepción
 
Pues de hecho estoy adaptando el código de python a c++
en python solo agrupaba los token y en el map ponía como llave el nombre y como valor una función
aaa..... ya se me abrió la mente
 
7:13 PM
jejejeje ... pues nada, duro con el
Que la pizza tiene que estar a punto de llegar, tengo que ir poniendo la mesa
:-)
Recuerda que en python todo es un puntero ... aunque tu no lo veas
no se, por si pudieras usar un map< string, Token *>
y trabajar siempre con Token
 
Aaa... claro, gracias
y bon apetit
 
Nada, que lo disfrutes jejeje
A poner la mesa :-)
 

« first day (2535 days earlier)      last day (570 days later) »