2011-06-21 16 views
6

İşlevin adını bir dize olarak almak için bir işlev değişkeni verildiğinde herhangi bir yol var mı? Mesela ben, eğer:Bir işlev değişkenini D'deki bir dizeye dönüştürmenin bir yolu var mı?

x(func) == "func"; 

:

void function(int) func; 

ben alabilir, bazı fonksiyon x() var mı? Miksleri kullanarak bunun mümkün olabileceğini hissediyorum, ancak bunun nasıl uygulanacağı konusunda kafam karıştı.

Bunu adı bir dize depolamış olabilir

ve mixin 'ed gerekli bir şey gibi: aklıma geliyor

cevap

7
func.stringof 

ne ihtiyaç vardır . hayır

template Name(alias Func) { enum Name = Func.stringof; } 

void func() { } 
pragma(msg, Name!(func)); //prints func() 
+1

edin:

Ayrıca bir şablon yapabiliriz. stringof, güvenilir bir özelliktir! Her durumda, orijinal soru beni rahatsız ediyor. Bir fonksiyon sembolünün ismini asla bilmemelisiniz; Güçlü bir kod kokusu var. Bunun yerine, ilk etapta işleve erişmek için kullandığınız şablon takma adının bilinen adını belirtmeniz yeterlidir. – FeepingCreature

+3

@FeepingCreature: Yansıma veya bir tür insan tarafından okunabilir otomatik serileştirme için yapıyorsanız kod kokusu değildir. Yine de telkinlerin güvenilmez olduğunu kabul ediyorum. –

+0

Hiç * iyi * (ya da kötü) bir fikir olduğunu söylemedim, sadece nasıl yaptığınızı söyledim ... – Mehrdad

0

En basit çözüm

string func_name = "func"; 
... 
int param = 294; 
mixin(func_name ~ "(" ~ to!string(param) ~ ")");