2010-11-03 2 views
6

Учитывая объявление функции в D, можно ли во время компиляции интроспективно представлять строковое представление любых имен параметров функции, для использования в функции автоматического отражения функции. .D: introspection имя параметра функции

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

Может register_function экстракт «а», «б», «в» во время компиляции подобным образом, __traits (AllMembers, SomeClass) может для класса?

+0

Для чего это необходимо? Я не вижу, как это требует ваш пример. – BCS

ответ

3

Я думаю, что одно из применений stringof дает имена. Вы можете разобрать их с небольшой работой. OTOH stringof не определен, поэтому это будет немного хрупким.

+0

Я попытался использовать stringof для функции, и он просто жалуется, что он не может быть вызван с заданным типом аргумента. Использование stringof в вызове функции приводит к строке вызова функции с ее аргументами, а не к именам параметров. Итак, если есть способ получить stringof, чтобы дать вам имена параметров функции, я не знаю, что это такое. –

+2

@ Джонатан: вам нужно применить 'stringof' к типу. I.e., если вы определяете 'void register_function (T) (T f) {auto a = T.stringof; } ', тогда вызов' register_function (&foo); 'дает функцию' a == "void (int a, double b, string c)". BCS предлагает проанализировать эту строку (которая определенно немного хрупкая, действительно). – stephan

+0

Спасибо за помощь в этом. Если вы передадите функцию через параметр шаблона псевдонима, то строка из псевдонима даст ошибку, однако использование типа, как указано выше, действительно дает полную строку, которую я затем анализирую вручную. Вручную разбор строки сложно, если типы сложны или если декларация состоит только из типов.Я использую это для автоматической регистрации функций в интерфейсе более высокого уровня, вызываемого с помощью аргументов именованной функции. – John

4

Вы можете использовать std.traits.ParameterTypeTuple!(), чтобы получить типы параметров, но я не знаю, как получить их имена. std.traits постоянно улучшается, так что моя добавка добавляется. Вероятность заключается в том, что никто, кто работает над ней, не думал об этой конкретной необходимости, поэтому они еще не добавили ее. Я бы предложил создать для него enhancement request, и есть хорошие шансы, что они его добавят.

+0

Пожалуйста, сделайте запрос на повышение! Это было бы очень полезно l для создания библиотек привязки, таких как Boost.Python или luabind. –

+1

С тех пор, я не вижу никаких признаков того, что Джон создал запрос на улучшение для этого, я создал один: http://d.puremagic.com/issues/show_bug.cgi?id=5175 –

+0

Большое спасибо за то, что выдвинул этот запрос для меня , – John

Смежные вопросы