2010-11-03 17 views
6

D'de bir işlev bildirimi verildiğinde, derleme zamanında, herhangi bir işlev parametresi adının dize olarak temsil edilmesini, örneğin otomatik işlev yansımasında kullanmak için bir inceleme yapmak mümkündür. E.g.D: işlev parametre adı iç gözlemi

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

bir sınıf için (AllMembers, birSınıf) teneke __traits benzer şekilde derleme zamanında, "b", "c" özü "a" register_function miyim?

+0

Ne için ihtiyacınız var? Senin örneğinin bunu nasıl gerektirdiğini anlamıyorum. – BCS

cevap

3

Stringof'in kullanım alanlarından birinin adlarını verdiğini düşünüyorum. Onları biraz iş ile ayrıştırabilirsin. OTOH stringof kötü tanımlanmış olduğundan, bu biraz kırılgan olacaktır.

+0

Bir işlevde stringof kullanmayı denedim ve yalnızca belirtilen argüman türü ile callable olmadığından şikayet ediyor. Bir işlev çağrısında stringof kullanılması, işlev çağrısının bir dizgesini, argümanlarıyla birlikte, parametrelerin adlarıyla değil sonuçlanır. Yani, eğer işlev parametrelerinin isimlerini vermek için bir ipucu olmanın bir yolu varsa, bunun ne olduğunu bilmiyorum. –

+2

@Jonathan: "stringof" öğesini türüne uygulamanız gerekir. Yani, eğer 'void register_function (T)' yi tanımlarsanız (Tf) {auto a = T.stringof; } ', daha sonra bir çağrı' register_function (&foo); '' a == ”void fonksiyonunu verir (int a, double b, string c)" '. BCS bu dizgeyi ayrıştırmayı önerir (bu kesinlikle biraz kırılgan, gerçekten). – stephan

+0

Bu konuda yardımcı olduğunuz için teşekkürler. Eğer bir alias şablon parametresi üzerinden işlevi iletirseniz, diğer ad üzerinde stringof bir hata verir, ancak yukarıda işaret edilen türü kullanmak, daha sonra el ile ayrıştırdığım tam dizeyi verir. tipler karmaşıksa veya bildirim yalnızca türlerden oluşuyorsa, bu işlevler, işlevlerin adlandırılmış işlev argümanlarıyla çağrılabilen üst düzey bir arabirimde otomatik olarak kaydedilmesi için kullanıyorum. – John

4

Parametre türlerini almak için std.traits.ParameterTypeTuple!()'u kullanabilirsiniz, ancak isimlerini almanın bir yolunun farkında değilim. Bununla birlikte, std.traits sürekli olarak geliştiriliyor, bu yüzden almam eklendi. Oranlar, sadece üzerinde çalışan hiç kimsenin bu özel ihtiyacı düşünmediği içindir, bu yüzden henüz eklememişlerdir. Bunun için bir enhancement request oluşturmayı öneriyorum ve ekleyeceğiniz iyi bir olasılık var.

+0

Lütfen bir geliştirme talebi yapın! Boost.Python veya luabind gibi bağlayıcı kütüphaneler oluşturmak için. –

+1

Bundan dolayı, bunun için bir geliştirme isteği oluşturmayan John belirtisi görmedim, bir tane oluşturdum: http://d.puremagic.com/issues/show_bug.cgi?id=5175 –

+0

Bu istek benim için öne sürdüğünüz için çok teşekkürler . – John