内省模板参数(特别是模板别名参数)

时间:2011-11-05 03:22:38

标签: templates metaprogramming introspection d

假设我有一个D模板结构:

struct Foo(alias pred) {}

我想写一个模板来反省pred是什么:

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

有没有简单的方法可以做到这一点?如果是这样,introspectPred如何实施?

3 个答案:

答案 0 :(得分:1)

我唯一能想到的是在Foo类型中定义枚举并进行一些基本的内省。 E.g:

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()
{

}

答案 1 :(得分:0)

与Andrej的解决方案类似,但更灵活一点:

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);

我完全抛弃了内省模板 - 你应该能够通过在Predicate成员上使用typeof和lot来获得你需要的东西。

答案 2 :(得分:0)

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

只有第二次过载就足够了,但DMD不同意。