Pregunta

Actualmente estoy desarrollando un syntaxic analizador de la clase que necesita, en un punto del código, para ordenar las estructuras de la celebración de información acerca de los operadores.Cada operador tiene una prioridad, que es definido por el usuario a través de funciones miembro públicas de mi analizador de clase.Por lo tanto, a la hora de ordenar, yo necesito mi función de clasificación para ordenar los elementos en base a la prioridad del operador correspondiente.Estoy usando el siguiente código para comparar los elementos:

bool parser::op_comp(const op_info& o1, const op_info& o2) {
    op_def& op1 = operators[o1.op_char];
    op_def& op2 = operators[o2.op_char];

    return op1.priority > op2.priority;
}

Tenga en cuenta que he tenido que hacer esta función estática, ya que se define dentro de una clase.

De hecho, mi función comparar compara los elementos de tipo op_char, y puedo recuperar el operador de la definición de un mapa que contiene elementos de tipo op_def, que tiene un campo "prioridad".

El problema que estoy enfrentando es que no he podido usar std::sort(ops.begin(), ops.end(), std::mem_fun_ref(&parser::op_comp)) (donde ops es un vector of op_info) método.Me sale el siguiente error, lo cual suena bastante lógico :

error:uso no válido de los estados " parser::operadores en función miembro estática

Aquí está mi pregunta :cómo puedo forzar std::ordenar el uso de una comp función que hace uso de los elementos de los miembros no estáticos de la clase ?Obviamente, la función debe ser no-estática, pero no he podido usarlo si no es estática...

Gracias de antemano por su ayuda, La PPC.

¿Fue útil?

Solución

El uso de un functor en lugar de una función:

struct op_comp : std::binary_function<op_info, op_info, bool>
    {
    op_comp(parser * p) : _parser(p) {}
    bool operator() (const op_info& o1, const op_info& o2) {
        return _parser->op_comp(o1, o2);
    }
    parser * _parser;
};

De esta manera el método op_comp puede permanecer no-estático.Sin embargo, la persona necesita una instancia del analizador, donde están todos los operadores están almacenados.Este es el uso de nuestra nueva functor:

std::sort(ops.begin(), ops.end(), op_comp(&my_parser));

Donde my_parser es el ejemplo de analizador está utilizando.Alternativamente, si usted está llamando std::sort desde el analizador, puede escribir simplemente:

std::sort(ops.begin(), ops.end(), op_comp(this));

Otros consejos

Hacer que los operadores de estática, así, y usted será capaz de utilizarlo en op_comp.

Como alternativa, utilice un functor en lugar de una función:

class myCompareClass {
  public:
  bool operator() (
    const op_info& o1, const op_info& o2) { 
    op_def& op1 = operators[o1.op_char]; 
    op_def& op2 = operators[o2.op_char]; 

    return op1.priority > op2.priority; 
  }
  private:
    ... operators ...
} myCompareObject;

std::sort(ops.begin(), ops.end(), myCompareObject) 

Ver más ejemplos en cplusplus.com

Si desea op_comp a ser estática no puede usar el Boost.Lambda o Impulso.Bind:

parser my_parser;
sort(ops.begin(), ops.end(), bind(&parser::op_comp, ref(my_parser)));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top