Нет специальной функции сопоставления с образцом, столь же мощной, как в Haskell или Scala.
Как вы уже поняли, перегрузка и вызов (шаблонных) функций или делегатов - это ограниченная форма сопоставления с образцом.Вы можете сопоставлять только типы аргументов.
Вы можете сопоставлять шаблоны с временем компиляции аргументами шаблона.Также невозможно извлечь содержимое объекта.Но вы можете извлечь содержимое типа.
Например:
import std.stdio, std.conv;
template match(T...){
enum match = "default case";
}
template match(string a : "x", int b : 1, int c){
enum match = "matched 1, b="~to!string(b);
}
template match(int a, string b, int c : 100){
enum match = "matched 2, b="~b;
}
template match(T : T[]*[]){
enum match = "matched 3, an array of pointers to an array of "~T.stringof;
}
void main(){
int a=100;
writeln(match!("x",1,5)); // "matched 1, b=1"
writeln(match!(12,"str")); // "default case"
writeln(match!(12,"str",100)); // "matched 2, b=str"
writeln(match!(int*[]*[])); // "matched 3, an array of pointers to an array of int*"
//writeln(match!(12,"str",a)); // would be error, because 'a'
// is not evaluable during compile time
}
Если вам интересно, вы можете взглянуть на http://d -programming-language.org/template.html.
'is' - выражения - это еще один способ сопоставления с образцом типов, см.
http://d -programming-language.org / expression.html (поиск "IsExpression").