2015-10-09 11 views
6

Tôi đang cố gắng tìm ra một cách mạnh mẽ để xác định liệu một biểu tượng đã cho có phải là một mẫu hàm hay không. Sau đây:Xác định xem Biểu tượng có phải là một chức năng mẫu

import std.traits: isSomeFunction; 

auto ref identity(T)(auto ref T t) { return t; } 

static assert(isSomeFunction!identity); 

Sẽ không thành công cho đến khi được khởi tạo. Hiện nay tôi đang sử dụng một hack mà dựa trên thực tế là <template function symbol>.stringof được định dạng một cách chắc chắn:

//ex: f.stringof == identity(T)(auto ref T t) 
template isTemplateFunction(alias f) 
{ 
    import std.algorithm: balancedParens, among; 

    enum isTemplateFunction = __traits(isTemplate, f) 
     && f.stringof.balancedParens('(', ')') 
     && f.stringof.count('(') == 2 
     && f.stringof.count(')') == 2; 
} 

//Passes 
static assert(isTemplateFunction!identity); 

Tôi muốn biết nếu có một cách tốt hơn để làm điều này khác hơn hacky stringof phân tích cú pháp.

+0

chuỗi có thể là tốt nhất bạn sẽ nhận được kể từ khi làm thử nghiệm thêm nữa, bạn phải khởi tạo mẫu và không có cách nào đảm bảo thực sự làm điều đó. (Xem xét một với một ràng buộc 'if (false)', nó sẽ là không thể bao giờ có được bên trong nó). –

Trả lời

0

Dường như không có cách nào tốt hơn để thực hiện điều này trong D như bây giờ, vì vậy tôi sẽ dính vào phân tích cú pháp. Stringof, như là một hack như nó là.

Các vấn đề liên quan