2010-11-03 42 views
6

Étant donné une déclaration de fonction dans D, est-il possible d'introspecter au moment de la compilation la représentation sous forme de chaîne de tous les noms de paramètres de fonction, par exemple dans la fonction de réflexion automatique. E.g.D: nom du paramètre de fonction introspection

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

peut register_function extrait "a", "b", "c" au moment de la compilation d'une manière similaire __traits (ALLMEMBERS, someClass) peut pour une classe?

+0

Qu'est-ce que vous en avez besoin? Je ne vois pas comment votre exemple l'exige. – BCS

Répondre

3

Je pense que l'une des utilisations de stringof donne les noms. Vous pouvez les analyser avec un peu de travail. OTOH stringof est mal défini donc ce serait un peu fragile.

+0

J'ai essayé d'utiliser stringof sur une fonction, et il se plaint simplement qu'il ne soit pas appelable avec le type d'argument donné. Utiliser stringof sur un appel de fonction entraîne une chaîne de l'appel de fonction avec ses arguments, pas les noms des paramètres. Donc, s'il y a un moyen d'obtenir stringof pour vous donner les noms des paramètres de la fonction, je ne sais pas ce que c'est. –

+2

@Jonathan: vous devez appliquer 'stringof' au type. C'est-à-dire, si vous définissez la fonction de registre vide (T) (T f) {auto a = T.stringof; } ', alors un appel' register_function (&foo); 'donne' a == "fonction vide (int a, double b, chaîne c)" '. BCS suggère d'analyser cette chaîne (ce qui est certainement un peu fragile, en effet) – stephan

+0

Si vous passez la fonction à travers un paramètre de template alias alors stringof sur l'alias donne une erreur, mais utiliser le type comme indiqué ci-dessus donne en effet la chaîne complète, que j'analyse ensuite manuellement. est difficile si les types sont complexes ou si la déclaration est composée uniquement de types Je l'utilise pour enregistrer automatiquement des fonctions dans une interface de niveau supérieur appelable avec des arguments de fonction nommés – John

4

Vous pouvez utiliser std.traits.ParameterTypeTuple!() pour obtenir les types de paramètres, mais je ne connais aucun moyen d'obtenir leur nom. std.traits est continuellement améliorée, cependant, de sorte que mon ajouté. Les chances sont que c'est juste que personne qui travaille dessus n'a pensé à ce besoin particulier, donc ils ne l'ont pas encore ajouté. Je suggère de créer un enhancement request pour cela, et il y a de bonnes chances qu'ils vont l'ajouter.

+0

Veuillez faire une demande d'amélioration! l pour créer des bibliothèques de liaison comme Boost.Python ou luabind. –

+1

Depuis, je ne vois aucun signe de John créant une demande d'amélioration pour cela, j'en ai créé un: http://d.puremagic.com/issues/show_bug.cgi?id=5175 –

+0

Merci beaucoup de m'avoir fait cette demande . – John