通常使用一种亚类会起作用,但不幸的是,由于模板的局限性, does然不灵。 例如,一种可行的解决办法(现在就没有工作),就是将reg作为子类:
auto myregex(string arg1, string arg2)
{
struct RegexWrap
{
Regex!char reg;
alias reg this;
string dumpAsText;
}
return RegexWrap(regex(arg1, arg2), arg1);
}
void main()
{
auto r = myregex(r"[0-9]", "g"); // create regular expression
writeln(r.dumpAsText); // this would write: [0-9]
writeln(match("12345", r)); // won t work
}
The match
function in setd. 即使在使用一种子类时,reg也获得了这种包装的 t子,因为它没有这一模板限制:
public auto match(R, RegEx)(R input, RegEx re)
is(RegEx == Regex!(BasicElementOf!R)
即便你改变了主人,它仍然赢得以下工作:
public auto match(R)(R input, Regex!(BasicElementOf!R) re)
唯一可行的办法是,如果这种类型明确无误,就可以通过该次类型:
public auto match(R)(R input, Regex!char re)
我认为,这是可以改进的D的一个薄弱环节。