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?
davy.ai
La razón por la cual el operador
+=
amigo no tiene un atributospelling
es porque no es una función miembro de la claseTimer
. Es una función no miembro que ha sido declarada como amiga de la claseTimer
. 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 claseCursor
declang
. Sin embargo, podrías intentar acceder al atributospelling
del operador+
dentro de la funciónoperator+=
, ya que+=
es simplemente una forma abreviada de+
y=
. Alternativamente, podrías definiroperator+=
como una función miembro de la claseTimer
en lugar de una función amiga, lo que permitiría obtener su atributospelling
utilizando el mismo código que para la funciónoperator==
.