2010-11-03 16 views
6

Dada una declaración de función en D, es posible introspectivamente en tiempo de compilación la representación de cadena de los nombres de cualquier parámetro de función, para usar, por ejemplo, en la función de reflexión automática. P. ej.D: nombre de parámetro de función introspección

void foo(int a, double b, string c) { } 
register_function!(foo)() 

Puede register_function extracto de "a", "b", "c" en tiempo de compilación de una manera similar que __traits (allMembers, SomeClass) CAN para una clase?

+0

¿Para qué lo necesitas? No veo cómo tu ejemplo lo requiere. – BCS

Respuesta

3

Creo que uno de los usos de stringof da los nombres. Puedes analizarlos con un poco de trabajo. OTOH stringof está mal definido así que esto sería un poco frágil.

+0

Intenté usar stringof en una función, y solo se queja de que no se puede llamar con el tipo de argumento dado. Al usar stringof en una función, la llamada da como resultado una cadena de la llamada de función con sus argumentos, no los nombres de los parámetros. Entonces, si hay una manera de obtener stringof para darle los nombres de los parámetros de la función, no sé de qué se trata. –

+2

@Jonathan: tiene que aplicar 'stringof' al tipo. Es decir, si define 'void register_function (T) (T f) {auto a = T.stringof; } ', luego una llamada' register_function (&foo); 'da' a == "función void (int a, double b, string c)" '. BCS sugiere analizar esta cadena (que definitivamente es un poco frágil, de hecho). – stephan

+0

Gracias por ayudarme con esto. Si pasas la función a través de un parámetro de plantilla alias, stringof en el alias da un error, sin embargo, usar el tipo indicado anteriormente da la cadena completa, que luego analizo manualmente. es difícil si los tipos son complejos o si la declaración solo consta de tipos. Utilizo esto para registrar automáticamente funciones en una interfaz de nivel superior que se puede llamar con los argumentos de función nombrada. – John

4

Puede usar std.traits.ParameterTypeTuple!() para obtener los tipos de parámetros, pero no conozco ninguna forma de obtener sus nombres. std.traits se mejora continuamente, sin embargo, para que mi se agregue. Lo más probable es que nadie que trabaje en él haya pensado en esa necesidad en particular, por lo que aún no la han agregado. Sugiero crear un enhancement request para él, y hay muchas posibilidades de que lo agreguen.

+0

¡Realice una solicitud de mejora! Esto sería muy útil. l para crear bibliotecas vinculantes como Boost.Python o luabind. –

+1

Como no veo ninguna señal de que John haya creado una solicitud de mejora para esto, he creado una: http://d.puremagic.com/issues/show_bug.cgi?id=5175 –

+0

Muchas gracias por presentarme esta solicitud. . – John

Cuestiones relacionadas