2016-04-10 41 views
0

Tek bir string'da saklanan nitelikli bir adı AliasSeq'a dönüştürmek istiyorum.Boş AliasSeq nasıl kullanılır?

template QName(string qname_str) { 
    static if (qname_str.empty) { 
    import std.meta : AliasSeq; 
    alias QName = AliasSeq!(); 
    } else { 
    import std.meta : aliasSeqOf; 
    alias QName = aliasSeqOf!(qname_str.split(".")); 
    } 
} 

unittest { 
    // OK: 
    static assert(QName!"com.example"[0..$-1] == QName!"com"); 

    // Error: incompatible types for ((tuple()) == (())): cannot use '==' with types 
    static assert(QName!"com"[0..$-1] == QName!""); 
} 

Bildirim boş nitelikli adıyla karşılaştırma için hata: İşte benim girişimidir. Çeşitli girişimleri denedim, böylece sol taraftaki sağ taraf ile aynı tipte ve ben de onları is ile karşılaştırmayı denedim, fakat her halükarda bir hatam var. Herhangi bir öneri boş AliasSeq -s işlemek nasıl?

cevap

0

şablon iyi, ama karşılaştırma için bir helper struct ve is gerekir:

unittest { 
    struct S(A...) {} 
    static assert(is(S!(QName!"com.example"[0..$-1]) == S!(QName!"com"))); 
    static assert(is(S!(QName!"com.example", QName!"mail") == S!(QName!"com.example.mail"))); 
    static assert(is(S!(QName!"com"[0..$-1]) == S!(QName!""))); 
}