Commencez par:
auto foo(T)(T n) if (isNumeric!T) {
// ignore this for now
}
foo est une fonction générique qui prend un argument de son type générique. if (isNumeric!T)
est un contrôle à la compilation de std.traits qui garantit que le type de foo est numérique. Les types non numériques ne fonctionneront pas. Son type de retour est déduit et dans ce cas est un délégué.
Ce:
(T m) {return m > n;}; //returned from foo
est un delegate literal (or closure). C'est fondamentalement un pointeur de fonction avec l'état. Dans ce cas, il se ferme sur le paramètre n
transmis à foo. Dans votre exemple:
auto hoo5 = foo!int(1000);
se traduit efficacement à la fonction:
bool hoo5 (int x) { return x > 1000; }
Ainsi, lorsque vous appelez hoo5
, elle renvoie une valeur booléenne indiquant si son argument est supérieur à 1000 - mais seulement dans votre cas .
Si vous appelez foo comme ceci:
auto hoo5 = foo!double(1.2345);
Vous obtenez une référence à une fonction qui renvoie une valeur booléenne indiquant si son argument (double) est supérieur à 1,2345.
Il y a des fautes de frappe. Je l'ai réparé. Merci! – Nate
Vous expliquez vraiment bien. Je le comprends maintenant. Je vous remercie. – Nate