2010-12-03 16 views
10

¿Alguien puede explicar el siguiente código? Me confundo cuando trato de entender cómo funciona Numérico! T en este caso.Plantilla en programación D

auto foo(T)(T n) if (isNumeric!T) { 
    return (T m) {return m > n;}; 
} 

void main() { 
    auto hoo5 = foo!int(1000); 
    writeln(hoo5(93)); 
    writeln(hoo5(23)); 
} 

Respuesta

13

Inicio con:

auto foo(T)(T n) if (isNumeric!T) { 
    // ignore this for now 
} 

foo es una función genérica que toma un argumento de este tipo genérico. if (isNumeric!T) es una verificación en tiempo de compilación de std.traits que garantiza que el tipo de foo es numérico. Los tipos no numéricos no funcionarán. Se deduce su tipo de devolución y en este caso es un delegado.

Este:

(T m) {return m > n;}; //returned from foo 

es una delegate literal (or closure). Básicamente es un puntero de función con estado. En este caso, se cierra sobre el parámetro n pasado a foo. En su ejemplo:

auto hoo5 = foo!int(1000); 

se traduce de manera efectiva a la función:

bool hoo5 (int x) { return x > 1000; } 

Así que cuando se llama a hoo5, devuelve un valor booleano que indica si su argumento es mayor de 1000 - pero sólo en el caso concreto .

Si llama foo como esto:

auto hoo5 = foo!double(1.2345); 

Usted obtener una referencia a una función que devuelve un valor booleano que indica si su argumento (un doble) es mayor que 1,2345.

+0

Hay errores tipográficos. Lo he arreglado ¡Gracias! – Nate

+1

Explicas muy bien. Lo entiendo ahora Gracias. – Nate

Cuestiones relacionadas