ACTUALIZACIÓN: Después de algunas lecturas adicionales, lo que realmente quería era garantizar la vinculación anticipada (que debería traducirse en una llamada inmediata para funciones no virtuales y código no PIC), lo que se puede hacer pasando una función (miembro) como un parámetro de plantilla. El problema que tuve fue que gcc < 4.5 y icc 11.1 pueden generar algunas instrucciones funky para las llamadas a parámetros de plantilla de puntero de funciones miembro. AFAICT, gcc> = 4,5 y vs2008 manejan bien estas llamadas al parámetro de la plantilla.¿Dónde están los literales de dirección de función en C++?
En primer lugar, tal vez literales no es el término correcto para este concepto, pero es lo más parecido que pude pensar (no literales en el sentido de funciones como ciudadanos de primera clase).
La idea es que cuando se hace una llamada a la función convencional, se compila a algo como esto:
callq <immediate address>
Pero si usted hace una llamada a la función utilizando un puntero de función, que se compila a algo como esto:
mov <memory location>,%rax
callq *%rax
Que está todo bien. Sin embargo, ¿qué sucede si estoy escribiendo una biblioteca de plantillas que requiere una devolución de llamada de algún tipo con una lista de argumentos especificada y se espera que el usuario de la biblioteca sepa a qué función desea llamar al compilar tiempo? Entonces me gustaría escribir mi plantilla para aceptar un literal de función como parámetro de plantilla. Así, similar a
template <int int_literal>
struct my_template {...};`
me gustaría escribir
template <func_literal_t func_literal>
struct my_template {...};
y tienen las llamadas a func_literal dentro my_template compilar a callq <immediate address>
.
¿Hay alguna instalación en C++ para esto, o una solución alternativa para lograr el mismo efecto? Si no, ¿por qué no (por ejemplo, algunos efectos secundarios cataclísmicos)? ¿Qué hay de C++ 0x u otro idioma?
Este tema es útil, ya que permite intercambiar diferentes funcionalidades durante el tiempo de ejecución. Por ejemplo, la API DOS usa ID para mapear funciones. Esto permite que la funcionalidad de DOS cambie con efectos mínimos para el ejecutable. Simplemente cambie los contenidos (direcciones de funciones) en la tabla de búsqueda. –
Los funtores en combinación con las plantillas son de tiempo de compilación. La mayoría de los STL funcionan así o ¿hay alguna advertencia en su problema? – pmr
@pmr advertencia es que la solución no debería tener ningún impacto en el código de los usuarios; si no están utilizando objetos de función, no quiero obligarlos a usar objetos de función. – academicRobot