es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

clang: ¿las funciones amigas no tienen el atributo de ortografía?

Quiero usar la clase de cursor Cursor de clang para obtener el atributo spelling de la función de operador para Timer desde python, pero no funciona para una función amiga.

Dada la clase C++ Timer en Timer.hpp:

class Timer {
public:
    // función amiga de sobrecarga de operador para agregar minutos al temporizador
    friend Timer operator+=(Timer t, int add_mins) {
        // agregar
        return t;
    }
};

// sobrecarga de operador diferente como función no miembro no amiga
bool operator==(Timer t0, Timer t1) {
    return false;
}

Aquí está el código de python para obtener el atributo spelling:

from clang import cindex
def print_node(node):
    if len(node.spelling) > 0:
        print("Spelling for node of kind %s: %s" % (node.kind, node.spelling))
    else:
        print("Node of kind %s has no spelling" % node.kind)

index = cindex.Index(cindex.conf.lib.clang_createIndex(False, True))
tu = index.parse('Timer.hpp')
file_node = tu.cursor
for node in file_node.get_children():
    print_node(node)
    if node.kind is cindex.CursorKind.CLASS_DECL:
        for child in node.get_children():
            print_node(child)

    print("Node of kind %s has no spelling" % child.kind)

La salida del código de python es:

Spelling for node of kind CursorKind.CLASS_DECL: Timer
Node of kind CursorKind.CXX_ACCESS_SPEC_DECL has no spelling
Node of kind CursorKind.FRIEND_DECL has no spelling
Spelling for node of kind CursorKind.FUNCTION_DECL: operator==

Observa que el operador == tiene un spelling, pero el operador amigable += no lo tiene. ¿Por qué es esto y es posible obtener el spelling para la función amiga?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual el operador += amigo no tiene un atributo spelling es porque no es una función miembro de la clase Timer. Es una función no miembro que ha sido declarada como amiga de la clase Timer. Por lo tanto, no está asociada con la clase de la misma manera que una función miembro.

    Desafortunadamente, no es posible obtener el atributo spelling para el operador amigo += utilizando la clase Cursor de clang. Sin embargo, podrías intentar acceder al atributo spelling del operador + dentro de la función operator+=, ya que += es simplemente una forma abreviada de + y =. Alternativamente, podrías definir operator+= como una función miembro de la clase Timer en lugar de una función amiga, lo que permitiría obtener su atributo spelling utilizando el mismo código que para la función operator==.

Comments are closed.