2011-06-21 9 views
6

Có cách nào, cho một biến chức năng, để lấy tên của hàm như là một chuỗi? Ví dụ, nếu tôi có:Có cách nào để chuyển đổi một biến chức năng thành một chuỗi trong D?

void function(int) func; 

Có một số chức năng x() như vậy mà tôi có thể nhận được:

x(func) == "func"; 

? Tôi cảm thấy như thế này sẽ có thể sử dụng mixin, nhưng tôi đang bối rối như thế nào để thực hiện điều này.

giải pháp

Trả lời

7
func.stringof 

là những gì bạn cần .

Bạn cũng có thể tạo ra một mẫu:

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

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

hãy không. stringof là _not_ một tính năng đáng tin cậy! Trong mọi trường hợp, câu hỏi ban đầu sẽ gây lỗi cho tôi. Bạn không bao giờ cần phải biết tên của một biểu tượng chức năng; đó là một mùi mã mạnh mẽ. Thay vào đó, chỉ cần chỉ định tên đã biết của bất kỳ bí danh mẫu nào bạn sử dụng để truy cập chức năng ở vị trí đầu tiên. – FeepingCreature

+3

@FeepingCreature: Nó không phải là một mùi mã nếu bạn đang làm nó để phản ánh, hoặc một số loại serialization tự động con người có thể đọc được. Tôi đồng ý rằng stringof là khá không đáng tin cậy mặc dù (nhưng điều này sẽ cải thiện). –

+0

Tôi chưa bao giờ nói đó là ý tưởng * hay * (hay xấu), tôi chỉ nói đó là cách bạn làm ... – Mehrdad

0

đơn giản mà nói đến cái tâm của tôi:

Bạn có thể đã tên của nó được lưu trữ trong một chuỗi, và mixin 'ed khi cần thiết, một cái gì đó như:

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