如何处理空的 AliasSeq?

How to handle empty AliasSeq?

我想将存储在单个 string 中的限定名称转换为 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 的任何建议?

模板很好,但为了比较,您需要 helper structis:

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