2016-04-10 2 views
0

Я хотел бы преобразовать квалифицированное имя, хранящееся в одном string, до AliasSeq. Вот моя попытка:Как обрабатывать пустой AliasSeq?

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!""); 
} 

Уведомление об ошибке для сравнения с пустым составным именем. Я пробовал различные попытки, поэтому левая сторона имеет тот же тип, что и правая сторона, и я также попытался сравнить их с is, но во всех случаях я получил ошибку. Любые предложения о том, как обращаться с пустым AliasSeq -s?

ответ

0

Шаблон прекрасно, но для сравнения вам нужно helper struct и is:

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!""))); 
} 
Смежные вопросы