2011-11-05 85 views
3

比方说,我有一个d模板结构:内省模板参数(尤其是模板别名参数)

struct Foo(alias pred) {} 

我想写一个模板来反省什么预解码是:

alias Foo!"a < b" FooLess; 
static assert(introspectPred!(FooLess) == "a < b"); 

有什么简单的方法来做到这一点?如果是这样,introspectPred如何实施?

回答

1

我能想到的唯一方法是在Foo类型中定义枚举并做一些基本的反思。例如:

struct Foo(alias pred) 
{ 
    enum string _pred = pred; 
} 

alias Foo!"a < b" FooLess; 
static assert(introspectPred!(FooLess) == "a < b"); 

template introspectPred(T) 
{ 
    enum string introspectPred = getMember!(T, "_pred"); 
} 

template getMember(T, string member) 
{ 
    static if (__traits(hasMember, T, member)) 
    { 
     enum getMember = mixin("T." ~ member); 
    } 
    else 
     enum getMember = "";  
} 

void main() 
{ 

} 
0

到安德烈的解决方案,但更多的灵活的类似:

struct Foo(alias pred) 
{ 
    enum Predicate = pred; 
} 

alias Foo!"a < b" FooLess; 
static assert(FooLess.Predicate == "a < b"); 

// Other types of predicate work as well 
bool bar() { return true; } 
alias Foo!bar FooBar; 
static assert(FooBar.Predicate == bar); 

我只是扔了反思模板完全 - 你应该能够得到你需要通过使用typeof和批号在Predicate成员上。

0
template introspectPred(X:Foo!T,string T){alias T introspectPred;} 
template introspectPred(X:Foo!T,alias T){alias T introspectPred;} 

只有第二次超载应该是足够的,但DMD不同意。